/*!
 * LMV v6.4.1
 * 
 * Copyright 2019 Autodesk, Inc.
 * All rights reserved.
 * 
 * This computer source code and related instructions and comments are the
 * unpublished confidential and proprietary information of Autodesk, Inc.
 * and are protected under Federal copyright and state trade secret law.
 * They may not be disclosed to, copied or used by any third party without
 * the prior written consent of Autodesk, Inc.
 * 
 * Autodesk Forge Viewer Usage Limitations:
 * 
 * The Autodesk Forge viewer can only be used to view files generated by
 * Autodesk Forge services. The Autodesk Forge Viewer JavaScript must be
 * delivered from an Autodesk hosted URL.
 */
Autodesk.Extensions.BimWalk =
/******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId]) {
/******/ 			return installedModules[moduleId].exports;
/******/ 		}
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			i: moduleId,
/******/ 			l: false,
/******/ 			exports: {}
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.l = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// define getter function for harmony exports
/******/ 	__webpack_require__.d = function(exports, name, getter) {
/******/ 		if(!__webpack_require__.o(exports, name)) {
/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
/******/ 		}
/******/ 	};
/******/
/******/ 	// define __esModule on exports
/******/ 	__webpack_require__.r = function(exports) {
/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
/******/ 		}
/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
/******/ 	};
/******/
/******/ 	// create a fake namespace object
/******/ 	// mode & 1: value is a module id, require it
/******/ 	// mode & 2: merge all properties of value into the ns
/******/ 	// mode & 4: return value when already ns object
/******/ 	// mode & 8|1: behave like require
/******/ 	__webpack_require__.t = function(value, mode) {
/******/ 		if(mode & 1) value = __webpack_require__(value);
/******/ 		if(mode & 8) return value;
/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
/******/ 		var ns = Object.create(null);
/******/ 		__webpack_require__.r(ns);
/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/******/ 		return ns;
/******/ 	};
/******/
/******/ 	// getDefaultExport function for compatibility with non-harmony modules
/******/ 	__webpack_require__.n = function(module) {
/******/ 		var getter = module && module.__esModule ?
/******/ 			function getDefault() { return module['default']; } :
/******/ 			function getModuleExports() { return module; };
/******/ 		__webpack_require__.d(getter, 'a', getter);
/******/ 		return getter;
/******/ 	};
/******/
/******/ 	// Object.prototype.hasOwnProperty.call
/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "";
/******/
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(__webpack_require__.s = "./extensions/BimWalk/BimWalk.js");
/******/ })
/************************************************************************/
/******/ ({

/***/ "./extensions/BimWalk/BimWalk.js":
/*!***************************************!*\
  !*** ./extensions/BimWalk/BimWalk.js ***!
  \***************************************/
/*! exports provided: BimWalkExtension */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BimWalkExtension", function() { return BimWalkExtension; });
/* harmony import */ var _BimWalkTool__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BimWalkTool */ "./extensions/BimWalk/BimWalkTool.js");


var avp = Autodesk.Viewing.Private;

/**
                                     * First Person navigation tool, similar to those found in videogames.
                                     * Supports keyboard and mouse input.
                                     * 
                                     * The extension id is: `Autodesk.BimWalk`
                                     * 
                                     * @example
                                     *   viewer.loadExtension('Autodesk.BimWalk')
                                     * 
                                     * @memberof Autodesk.Viewing.Extensions
                                     * @alias Autodesk.Viewing.Extensions.BimWalkExtension
                                     * @see {@link Autodesk.Viewing.Extension} for common inherited methods.
                                     * @constructor
                                     */
function BimWalkExtension(viewer, options) {

  Autodesk.Viewing.Extension.call(this, viewer, options);
  this.options = options;
  this.name = "bimwalk";
};

BimWalkExtension.prototype = Object.create(Autodesk.Viewing.Extension.prototype);
BimWalkExtension.prototype.constructor = BimWalkExtension;

var proto = BimWalkExtension.prototype;


proto.load = function () {

  var self = this;
  var viewer = this.viewer;
  var avu = Autodesk.Viewing.UI;

  // Register tool
  this.tool = new _BimWalkTool__WEBPACK_IMPORTED_MODULE_0__["BimWalkTool"](viewer, this.options);
  viewer.toolController.registerTool(this.tool);

  // Add the ui to the viewer.
  createUI(this);

  // Reflect active/enabled state in BimWalk button
  this.updateButtonState = function () {
    // BimWalk requires a model to initialize metersPerUnit
    var isEnabled = !!viewer.model;

    if (self.bimWalkToolButton) {
      var isActive = isEnabled && self.tool && self.tool.isActive();
      var state = isActive ? avu.Button.State.ACTIVE :
      isEnabled ? avu.Button.State.INACTIVE : avu.Button.State.DISABLED;
      self.bimWalkToolButton.setState(state);
    }

    // If we had to disable it on model-remove, we must deactivate the tool too
    // for consistentcy.
    if (self.activeStatus && !isEnabled) {
      self.deactivate();
    }

    // If we had to disable it on model-remove, we must deactivate the tool too
    // for consistentcy.
    if (self.activeStatus && !isEnabled) {
      self.deactivate();
    }
  };

  viewer.addEventListener(Autodesk.Viewing.TOOL_CHANGE_EVENT, this.updateButtonState);
  viewer.addEventListener(Autodesk.Viewing.MODEL_REMOVED_EVENT, this.updateButtonState);
  viewer.addEventListener(Autodesk.Viewing.MODEL_ADDED_EVENT, this.updateButtonState);
  return true;
};


proto.unload = function () {

  var viewer = this.viewer;

  // Remove listeners
  viewer.removeEventListener(Autodesk.Viewing.TOOL_CHANGE_EVENT, this.updateButtonState);
  viewer.removeEventListener(Autodesk.Viewing.MODEL_REMOVED_EVENT, this.updateButtonState);
  viewer.removeEventListener(Autodesk.Viewing.MODEL_ADDED_EVENT, this.updateButtonState);
  this.onToolChanged = undefined;

  // Remove hotkey
  viewer.getHotkeyManager().popHotkeys(this.HOTKEYS_ID);

  // Remove the UI
  if (this.bimWalkToolButton) {
    var toolbar = viewer.getToolbar(false);
    if (toolbar) {
      toolbar.getControl(Autodesk.Viewing.TOOLBAR.NAVTOOLSID).removeControl(this.bimWalkToolButton.getId());
    }
    this.bimWalkToolButton = null;
  }

  //Uh, why does the viewer need to keep track of this in addition to the tool stack?
  if (viewer.getActiveNavigationTool() == this.tool.getName())
  viewer.setActiveNavigationTool();

  // Deregister tool
  viewer.toolController.deregisterTool(this.tool);
  this.tool = null;

  return true;
};

proto.set = function (configuration, value) {

  if (this.tool.set(configuration, value)) {
    avp.logger.log('BimWalk ' + configuration + ' was set to: ' + this.tool.get(configuration));
  }
};

proto.get = function (configuration) {

  return this.tool.get(configuration);
};

proto.setJoystickPosition = function (x, y) {

  this.tool.setJoystickPosition(x, y);
};

proto.setJoystickSize = function (backgroundRadius, handleRadius) {

  this.tool.setJoystickSize(backgroundRadius, handleRadius);
};

/**
    * Enables the walk tool.
    * 
    * @memberof Autodesk.Viewing.Extensions.BimWalkExtension
    * @alias Autodesk.Viewing.Extensions.BimWalkExtension#activate
    */
proto.activate = function () {
  if (!this.activeStatus) {
    this.viewer.setActiveNavigationTool(this.tool.getName());
    this.activeStatus = true;
  }
  return true;
};

/**
    * Deactivates the walk tool.
    * 
    * @memberof Autodesk.Viewing.Extensions.BimWalkExtension
    * @alias Autodesk.Viewing.Extensions.BimWalkExtension#deactivate
    */
proto.deactivate = function () {
  if (this.activeStatus) {
    this.viewer.setActiveNavigationTool();
    this.activeStatus = false;
  }
  return true;
};


/**
    * @param extension
    */
function createUI(extension) {
  var viewer = extension.viewer;
  if (!viewer.getToolbar) {
    return; // Adds support for Viewer3D instance
  }

  var avu = Autodesk.Viewing.UI;
  var toolbar = viewer.getToolbar(true);
  var navTools = toolbar.getControl(Autodesk.Viewing.TOOLBAR.NAVTOOLSID);

  // Create a button for the tool.
  extension.bimWalkToolButton = new avu.Button('toolbar-bimWalkTool');
  extension.bimWalkToolButton.setToolTip('First person');
  extension.bimWalkToolButton.onClick = function (e) {
    if (extension.activeStatus) {
      extension.deactivate();
    } else {
      extension.activate();
    }
  };
  extension.bimWalkToolButton.setIcon("adsk-icon-first-person");

  var cameraSubmenuTool = navTools.getControl('toolbar-cameraSubmenuTool');
  if (cameraSubmenuTool) {
    navTools.addControl(extension.bimWalkToolButton, { index: navTools.indexOf(cameraSubmenuTool.getId()) });
  } else {
    navTools.addControl(extension.bimWalkToolButton);
  }
}

// Allow others to relocate the info button to avoid overlap with other widgets
proto.getInfoButton = function () {
  var nav = this.tool && this.tool.navigator;
  var ui = nav && nav.ui;
  return ui && ui.infoIcon;
};

Autodesk.Viewing.theExtensionManager.registerExtension('Autodesk.BimWalk', BimWalkExtension);

/***/ }),

/***/ "./extensions/BimWalk/BimWalkPools.js":
/*!********************************************!*\
  !*** ./extensions/BimWalk/BimWalkPools.js ***!
  \********************************************/
/*! exports provided: getTempVector, freeTempVectors */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getTempVector", function() { return getTempVector; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "freeTempVectors", function() { return freeTempVectors; });

// Extension made lot of vector operations,
// temporal vectors are created to not generate much garbage to be collected.

var temporalVectorSize = 128;
var temporalVectors = [];
var temporalVectorsIndex = 0;
var zero = { x: 0, y: 0, z: 0 };

/**
                                  * Gets a vector initialized with values or source using a simple pool of temporal intermediate math results objects.
                                  * Idea is to not make trash for garbage collection.
                                  * @param source
                                  * @returns {THREE.Vector3}
                                  */
function getTempVector(source) {

  // Initialize temporal vectors.
  for (var i = temporalVectors.length; i < temporalVectorSize; ++i) {
    temporalVectors.push(new THREE.Vector3());
  }

  source = source || zero;

  if (temporalVectorsIndex < temporalVectorSize) {
    return temporalVectors[temporalVectorsIndex++].copy(source);
  }

  Autodesk.Viewing.Private.logger.warn('Vector pool in Autodesk.Viewing.Extensions.BimWalk reached maximum size');
  return new THREE.Vector3().copy(source);
}

/**
   * Free vectors acquired from the pool with getTempVector.
   * @param vector
   */
function freeTempVectors() {

  temporalVectorsIndex = 0;
}

/***/ }),

/***/ "./extensions/BimWalk/BimWalkTool.js":
/*!*******************************************!*\
  !*** ./extensions/BimWalk/BimWalkTool.js ***!
  \*******************************************/
/*! exports provided: BimWalkTool */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BimWalkTool", function() { return BimWalkTool; });
/* harmony import */ var _BimWalkPools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BimWalkPools */ "./extensions/BimWalk/BimWalkPools.js");
/* harmony import */ var _BimWalkUtils__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./BimWalkUtils */ "./extensions/BimWalk/BimWalkUtils.js");
/* harmony import */ var _Navigators_NavigatorMobile__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./Navigators/NavigatorMobile */ "./extensions/BimWalk/Navigators/NavigatorMobile.js");
/* harmony import */ var _Navigators_NavigatorSimple__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./Navigators/NavigatorSimple */ "./extensions/BimWalk/Navigators/NavigatorSimple.js");






var AutodeskViewing = Autodesk.Viewing;

AutodeskViewing.EVENT_BIMWALK_CONFIG_CHANGED = "EVENT_BIMWALK_CONFIG_CHANGED";

/*
                                                                               * First Person View tool for LMV
                                                                               *
                                                                               * This tool provides a first person view with movement using the standard WASD keys
                                                                               * to forward/backward/left/right and the QE keys to move vertically.  The mouse or
                                                                               * cursor is used to orient the view.  Movement is always along or perpendicular to
                                                                               * the view direction.
                                                                               *
                                                                               * The SHIFT key may be used when moving to increase the speed.  Or the default
                                                                               * movement speed may be increased/decreased with the MINUS or EQUAL keys.  The
                                                                               * ZERO (0) will reset to the default speed values.
                                                                               *
                                                                               * @author Hans Kellner (Oct 2014)
                                                                               *
                                                                               */
function BimWalkTool(viewer, options) {

  this.viewer = viewer;
  this.options = options || {};
  this.names = ["bimwalk"];
  this.navapi = viewer.navigation;
  this.camera = this.navapi.getCamera();
  this.active = false;
  this.clock = new THREE.Clock(true);

  this.navigator = Autodesk.Viewing.isMobileDevice() ? new _Navigators_NavigatorMobile__WEBPACK_IMPORTED_MODULE_2__["NavigatorMobile"](this) : new _Navigators_NavigatorSimple__WEBPACK_IMPORTED_MODULE_3__["NavigatorSimple"](this);
};

var proto = BimWalkTool.prototype;

proto.set = function (configuration, value) {

  if (!this.navigator.set(configuration, value)) {
    return false;
  }

  // Value can differ from provided after navigation validations.
  value = this.navigator.get(configuration);

  // Fire config changed event.
  var event = {
    type: AutodeskViewing.EVENT_BIMWALK_CONFIG_CHANGED,
    data: {
      configuration: configuration,
      value: value } };



  this.viewer.dispatchEvent(event);
  return true;
};

proto.get = function (configuration) {

  if (configuration) {
    return this.navigator.get(configuration);
  }

  return this.navigator.configuration;
};

proto.isActive = function () {

  return this.active;
};

proto.activate = function (name) {

  this.active = true;
  this.clock.start();

  // Pause mouse-over highlight.
  this.viewer.impl.pauseHighlight(true);
  this.viewer.clearSelection();

  // Switch to perspective
  this.navapi.toPerspective();
  // Clamp fov to razonable values, useful when switching from orthogonal directly to first person.
  this.navapi.setVerticalFov(this.camera.fov);

  // Be sure look camera is not looking straigh up/down (Gimbal Lock).
  // Clamp pitch to min/max pitch if needed.
  var EPSILON = 0.0001;
  var camera = this.camera;
  var forward = new THREE.Vector3().copy(camera.target).sub(camera.position).normalize();
  var dot = forward.dot(camera.worldup);

  if (Math.abs(dot) >= 1 - EPSILON) {

    var navigator = this.navigator;
    var position = camera.position;
    var target = camera.target;
    var up = camera.up;

    var angle = dot < 0 ? navigator.getMinPitchLimit() : navigator.getMaxPitchLimit() - Math.PI;

    var length = new THREE.Vector3().copy(target).sub(position).length();
    var offset = new THREE.Vector3().copy(up).multiplyScalar(length * Math.tan(angle));
    offset.add(target).sub(position).normalize().multiplyScalar(length);

    this.navapi.setRequestTransition(true, position, offset.add(position), camera.fov);
  }

  // HACK: Place focus in canvas so we get key events.
  this.viewer.canvas.focus();
  this.navigator.activate();
};

proto.deactivate = function (name) {

  this.active = false;
  this.clock.stop();

  this.viewer.impl.pauseHighlight(false);

  this.navigator.deactivate();
};

proto.update = function () {

  // If this.viewer.model is null, we have no visible model at all - and calling metersToModel would crash.
  if (!this.active || !this.navapi.isActionEnabled('walk') || !this.viewer.model) {
    return false;
  }

  // Returns delta time in seconds since previous call.
  var elapsed = this.clock.getDelta();

  // Update navigator using fixed time step (frame rate of viewer is very unpredictable).
  var FIX_DELTA = 1 / 30;
  var MAX_UPDATES = 15;

  var updateNumber = 0;
  var updatesCount = Math.min(Math.ceil(elapsed / FIX_DELTA) | 0, MAX_UPDATES);

  var navigator = this.navigator;
  var mtsToModel = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_1__["metersToModel"])(1, this.viewer);
  var localCam = this.camera.clone();
  var deltaPitch = 0;
  var deltaYaw = 0;

  for (var i = 0; i < updatesCount; ++i) {

    var delta = Math.min(elapsed, FIX_DELTA);
    elapsed -= FIX_DELTA;

    Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["freeTempVectors"])();
    navigator.update(delta, localCam, updateNumber++, updatesCount);

    // Handle displacement changes.
    var deltaPosition = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(navigator.getVelocity()).multiplyScalar(delta);
    localCam.position.add(deltaPosition.multiplyScalar(mtsToModel));

    // Handle rotation changes.
    var deltaRotation = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(navigator.getAngularVelocity()).multiplyScalar(delta);
    deltaPitch += deltaRotation.x;
    deltaYaw += deltaRotation.y;
  }

  Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["freeTempVectors"])();

  var posChanged = localCam.position.distanceToSquared(this.camera.position) !== 0;
  var forward = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(this.camera.target).sub(this.camera.position);
  var newTarget = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(localCam.position).add(forward);
  var targetChanged = newTarget.distanceToSquared(this.camera.target) !== 0;

  // If position or target changed then update camera.
  if (posChanged || targetChanged) {

    this.navapi.setView(localCam.position, newTarget);
    this.navapi.orientCameraUp();
  }

  // From the Collaboration extension:
  //the "go home" call may change the camera back to ortho... and we can't do ortho while walking...
  //HACK: Really, the home view should be set once when launch the extension, then set it back.
  if (!this.camera.isPerspective) {
    console.log("Lost perspective mode: resetting view.");
    this.navapi.toPerspective();
  }

  // Handle look changes
  var directionFwd = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(this.camera.target).sub(this.camera.position);
  var directionRight = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(directionFwd).cross(this.camera.worldup).normalize();
  var angularVelocity = this.navigator.getAngularVelocity();

  if (deltaPitch !== 0) {

    var pitchQ = new THREE.Quaternion();
    pitchQ.setFromAxisAngle(directionRight, -deltaPitch);

    var dirFwdTmp = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(directionFwd);
    dirFwdTmp.applyQuaternion(pitchQ);

    var vertical = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(this.camera.worldup);
    var verticalAngle = dirFwdTmp.angleTo(vertical);

    // If new angle is within limits then update values; otherwise ignore
    var minPitchLimit = navigator.getMinPitchLimit();
    var maxPitchLimit = navigator.getMaxPitchLimit();

    var angleBelowLimit = verticalAngle < minPitchLimit;
    var angleOverLimit = verticalAngle > maxPitchLimit;

    if (angleBelowLimit) {
      pitchQ.setFromAxisAngle(directionRight, -(minPitchLimit - verticalAngle + deltaPitch));
    }

    if (angleOverLimit) {
      pitchQ.setFromAxisAngle(directionRight, -(maxPitchLimit - verticalAngle + deltaPitch));
    }

    directionFwd.applyQuaternion(pitchQ);
    localCam.up.applyQuaternion(pitchQ);
  }

  if (deltaYaw !== 0) {

    var yawQ = new THREE.Quaternion();
    yawQ.setFromAxisAngle(this.camera.worldup, -deltaYaw);
    directionFwd.applyQuaternion(yawQ);
    localCam.up.applyQuaternion(yawQ);
  }

  // Now calc new target location and if it changed.
  var newPosition = localCam.position;
  var posChanged = newPosition.distanceToSquared(this.camera.position) !== 0;
  var newTarget = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(newPosition).add(directionFwd);

  //now fix newPosition for lockInPlane
  var targetChanged = newTarget.distanceToSquared(this.camera.target) !== 0;
  // If position or target changed then update camera.
  if (posChanged || targetChanged) {
    this.navapi.setView(newPosition, newTarget);
    this.navapi.orientCameraUp();
  }

  return this.camera.dirty;
};

proto.getNames = function () {

  return this.names;
};

proto.getName = function () {

  return this.names[0];
};

proto.getCursor = function () {

  return this.navigator.getCursor();
};

proto.handleButtonDown = function (event, button) {

  return this.navigator.handleButtonDown(event, button);
};

proto.handleButtonUp = function (event, button) {

  return this.navigator.handleButtonUp(event, button);
};

proto.handleMouseMove = function (event) {

  return this.navigator.handleMouseMove(event);
};

proto.handleGesture = function (event) {

  return this.navigator.handleGesture(event);
};

proto.handleSingleClick = function (event, button) {

  return this.navigator.handleMouseClick(event, button);
};

proto.handleDoubleClick = function (event, button) {

  return this.navigator.handleMouseDoubleClick(event, button);
};

proto.handleKeyDown = function (event, keyCode) {

  return this.navigator.handleKeyDown(event, keyCode);
};

proto.handleKeyUp = function (event, keyCode) {

  return this.navigator.handleKeyUp(event, keyCode);
};

proto.handleWheelInput = function (delta) {

  return this.navigator.handleWheelInput(delta);
};

proto.handleSingleTap = function (event) {

  return this.handleSingleClick(event, 0);
};

proto.handleDoubleTap = function (event) {

  return this.navigator.handleMouseDoubleClick(event);
};

proto.handleBlur = function (event) {

  return this.navigator.handleBlur(event);
};

proto.setJoystickPosition = function (x, y) {

  if (this.navigator.ui) {
    this.navigator.ui.setJoystickPosition(x, y);
  }
};

proto.setJoystickSize = function (backgroundRadius, handleRadius) {

  if (this.navigator.ui) {
    this.navigator.ui.setJoystickSize(backgroundRadius, handleRadius);
  }
};

/***/ }),

/***/ "./extensions/BimWalk/BimWalkUtils.js":
/*!********************************************!*\
  !*** ./extensions/BimWalk/BimWalkUtils.js ***!
  \********************************************/
/*! exports provided: metersToModel, getMousePosition, getWorldPosition, getWorldUpComponent, setWorldUpComponent, getSmallestFloorSide, isFloorIntersection, isWallIntersection, getFloorCandidates, easeInOutQuad, easeInQuad, updateFriction, updateVelocity, getForward */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "metersToModel", function() { return metersToModel; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getMousePosition", function() { return getMousePosition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWorldPosition", function() { return getWorldPosition; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getWorldUpComponent", function() { return getWorldUpComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "setWorldUpComponent", function() { return setWorldUpComponent; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSmallestFloorSide", function() { return getSmallestFloorSide; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isFloorIntersection", function() { return isFloorIntersection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isWallIntersection", function() { return isWallIntersection; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getFloorCandidates", function() { return getFloorCandidates; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "easeInOutQuad", function() { return easeInOutQuad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "easeInQuad", function() { return easeInQuad; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateFriction", function() { return updateFriction; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "updateVelocity", function() { return updateVelocity; });
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getForward", function() { return getForward; });
/* harmony import */ var _BimWalkPools__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./BimWalkPools */ "./extensions/BimWalk/BimWalkPools.js");


var tempBoundingBox = new Float32Array(6);
var EPSILON = 0.0001;

function metersToModel(meters, viewer) {

  return Autodesk.Viewing.Private.convertUnits('meters', viewer.model.getUnitString(), 1, meters, 'default');
};

function getMousePosition(event, viewer, position) {

  position.x = event.canvasX;
  position.y = event.canvasY;
};

function getWorldPosition(x, y, viewer) {

  viewport = viewer.navigation.getScreenViewport();

  x /= viewport.width;
  y /= viewport.height;

  return viewer.navigation.getWorldPoint(x, y);
};

function getWorldUpComponent(camera, vector) {

  // Assume up vector can be perfectly aligned to y or z axes.
  if (camera.worldup.y > camera.worldup.z) {
    return vector.y;
  } else {
    return vector.z;
  }
}

function setWorldUpComponent(camera, vector, value) {

  // Assume up vector can be perfectly aligned to y or z axes.
  if (camera.worldup.y > camera.worldup.z) {
    vector.y = value;
  } else {
    vector.z = value;
  }

  return vector;
}

function getSmallestFloorSide(intersection, camera, instanceTree) {

  var w = 0;
  var l = 0;

  instanceTree.getNodeBox(intersection.dbId, tempBoundingBox);

  // Assume up vector can be perfectly aligned to y or z axes.
  if (camera.worldup.y > camera.worldup.z) {
    w = Math.abs(tempBoundingBox[0] - tempBoundingBox[3]);
    l = Math.abs(tempBoundingBox[2] - tempBoundingBox[5]);
  } else {
    w = Math.abs(tempBoundingBox[0] - tempBoundingBox[3]);
    l = Math.abs(tempBoundingBox[1] - tempBoundingBox[4]);
  }

  return Math.min(w, l);
}

function isFloorIntersection(intersection, camera) {

  if (!intersection.face) {
    return false;
  }

  var normal = intersection.face.normal;
  if (normal.lengthSq() > 1 + EPSILON) {
    normal.normalize();
  }

  var cos = camera.worldup.dot(normal);
  return cos >= 0.5;
}

function isWallIntersection(intersection, camera) {

  if (!intersection.face) {
    return false;
  }

  var normal = intersection.face.normal;
  if (normal.lengthSq() > 1 + EPSILON) {
    normal.normalize();
  }

  var cos = camera.worldup.dot(normal);
  return cos >= 0.0 && cos <= 0.1;
}

function getFloorCandidates(
position,
cameraDistanceFromFloor,
minAllowedRoofDistance,
smallAllowedVerticalStep,
bigAllowedVerticalStep,
minFloorSidesLengthForBigVerticalStep,
viewer,
candidates,
obstacles) {

  var camera = viewer.impl.camera;
  var upVector = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(camera.worldup);

  // Search new floors with a ray downwards starting above the camera position at the maximum allowed roof distance.
  var rayOrigin = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(position).add(upVector.multiplyScalar(minAllowedRoofDistance));
  var rayDirection = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(upVector).multiplyScalar(-1);

  viewer.impl.rayIntersect(new THREE.Ray(rayOrigin, rayDirection), false, false, false, candidates);
  var candidatesCount = candidates.length;

  // If there are not collisions then return -1 (no best candidate index).
  if (candidatesCount === 0) {

    return -1;
  }

  // If we have just one candidate we take it as a floor only if it has the correct normal and it's below the previous camera position.
  if (candidatesCount === 1) {

    if (!isFloorIntersection(candidates[0], camera)) {

      return -1;
    }

    var allowedRoofDistanceSquared = minAllowedRoofDistance * minAllowedRoofDistance;
    if (candidates[0].point.distanceToSquared(position) < allowedRoofDistanceSquared) {

      return -1;
    }

    return 0;
  }

  // Search for the best candidate.
  var floorDistance = minAllowedRoofDistance + cameraDistanceFromFloor;
  var smallVerticalStepDistance = floorDistance - smallAllowedVerticalStep;
  var bigVerticalStepDistance = floorDistance - bigAllowedVerticalStep;

  var bestCandidate = -1;
  var feetDistanceSqured = cameraDistanceFromFloor + minAllowedRoofDistance;
  feetDistanceSqured *= feetDistanceSqured;

  var minDistance = Number.MAX_VALUE;
  var instanceTree = viewer.impl.model.getData().instanceTree;

  for (var i = 0; i < candidatesCount; ++i) {

    var candidate = candidates[i];

    // Walls are ignored completely, user goes through them, they are not roofs nor floors.
    if (isWallIntersection(candidate, camera)) {
      continue;
    }

    // Obstacles are geometries between the minimum roof distance and the big vertical step.
    if (obstacles &&
    candidate.distance > minAllowedRoofDistance &&
    candidate.distance < bigAllowedVerticalStep) {
      obstacles.push(candidate);
      continue;
    }

    // Geometry at maximum vertical step or lower is considered a roof if its slope is too steep to be considered a floor.
    if (!isFloorIntersection(candidate, camera)) {
      continue;
    }

    // Choose vertical step.
    var verticalStepDistance = smallVerticalStepDistance;

    // If the instance tree is still loading we use the bigger step (it's better to climb on a table than fall though a floor).
    if (!instanceTree) {
      verticalStepDistance = bigVerticalStepDistance;
    } else {

      var side = getSmallestFloorSide(candidate, camera, instanceTree);
      if (side > minFloorSidesLengthForBigVerticalStep) {
        verticalStepDistance = bigVerticalStepDistance;
      }
    }

    // Check if candidate can be climbed.
    if (candidate.distance < verticalStepDistance) {
      continue;
    }

    // Best candidate is the one closer along the world up vector to the currenct camera position.
    var distance = Math.abs(
    getWorldUpComponent(camera, position),
    getWorldUpComponent(camera, candidate.point));


    if (minDistance > distance) {
      minDistance = distance;
      bestCandidate = i;
    }
  }

  return bestCandidate;
};

function easeInOutQuad(t, b, c, d) {

  t /= d / 2;
  if (t < 1) {
    return c / 2 * t * t + b;
  }
  t--;
  return -c / 2 * (t * (t - 2) - 1) + b;
};

function easeInQuad(t, b, c, d) {

  t /= d;
  return c * t * t + b;
};

// Calculate friction contribution to final accelerator vector.
function updateFriction(accelerationModule, velocity, acceleration) {

  var speedSquared = velocity.lengthSq();
  if (speedSquared > 0) {

    var friction = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])();
    friction.copy(velocity).normalize().multiplyScalar(-1);

    // Hack friction factor.
    friction.multiplyScalar(accelerationModule * accelerationModule);
    acceleration.add(friction);
  }
  return speedSquared > 0;
};

// Calculate velocity contribution to velocity vector.
function updateVelocity(elapsed, acceleration, topSpeed, clampSpeed, friction, velocity) {

  var current = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(velocity);
  current.add(acceleration.multiplyScalar(elapsed));

  if (clampSpeed) {

    if (current.lengthSq() > topSpeed * topSpeed) {
      current.normalize();
      current.multiplyScalar(topSpeed);
    }
  }

  if (friction) {

    if (current.lengthSq() < EPSILON || current.dot(velocity) < 0) {
      current.set(0, 0, 0);
    }
  }

  velocity.copy(current);
};

function getForward(camera) {

  return Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_0__["getTempVector"])(camera.target).sub(camera.position).normalize();
};

/***/ }),

/***/ "./extensions/BimWalk/Navigators/Navigator.js":
/*!****************************************************!*\
  !*** ./extensions/BimWalk/Navigators/Navigator.js ***!
  \****************************************************/
/*! exports provided: Navigator */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Navigator", function() { return Navigator; });


var Private = Autodesk.Viewing.Private;

/**
                                         *
                                         * @constructor
                                         */
function Navigator(tool) {

  this.tool = tool;
  this.viewer = tool.viewer;
  this.velocity = new THREE.Vector3(0, 0, 0);
  this.angularVelocity = new THREE.Vector3(0, 0, 0);
  this.configuration = {};
}

var proto = Navigator.prototype;

/**
                                  *
                                  * @param configuration
                                  * @param value
                                  * @returns {boolean}
                                  */
proto.set = function (configuration, value) {

  if (!this.configuration.hasOwnProperty(configuration)) {
    Private.logger.warn('err! configuration not defined for current navigator in BimWalk: ' + configuration);
    return false;
  }

  if (!value === null || value === undefined) {
    Private.logger.warn('err! configuration value should be a number: ' + value);
    return false;
  }

  this.configuration[configuration] = value;
  return true;
};

/**
    *
    * @param configuration
    * @returns {*}
    */
proto.get = function (configuration) {

  if (!this.configuration.hasOwnProperty(configuration)) {
    Private.logger.warn('err! configuration not defined for current navigator in BimWalk: ' + configuration);
    return undefined;
  }

  return this.configuration[configuration];
};

/**
    *
    *
    */
proto.activate = function () {

};

/**
    *
    *
    */
proto.deactivate = function () {

};

/**
    *
    *
    */
proto.getCursor = function () {

  // Default.
  return null;
};

/**
    *
    * @returns {THREE.Vector3}
    */
proto.getVelocity = function () {

  return this.velocity;
};

/**
    *
    * @returns {THREE.Vector3}
    */
proto.getAngularVelocity = function () {

  return this.angularVelocity;
};

/**
    * 
    * @returns {Number}
    */
proto.getMinPitchLimit = function () {

  return THREE.Math.degToRad(20);
};

/**
    * 
    * @returns {Number}
    */
proto.getMaxPitchLimit = function () {

  return THREE.Math.degToRad(160);
};

/**
    *
    * @param elapsed
    * @param camera
    * @param updateNumber
    * @param updatesCount
    */
proto.update = function (elapsed, camera, updateNumber, updatesCount) {

};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleGesture = function (event) {

  return false;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleButtonDown = function (event, button) {

  return false;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleButtonUp = function (event, button) {

  return false;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleMouseClick = function (event, button) {

  return false;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleMouseDoubleClick = function (event, button) {

  return false;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleMouseMove = function (event) {

  return false;
};

/**
    *
    * @param event
    * @param keyCode
    * @returns {boolean}
    */
proto.handleKeyDown = function (event, keyCode) {

  return true;
};

/**
    *
    * @param event
    * @param keyCode
    * @returns {boolean}
    */
proto.handleKeyUp = function (event, keyCode) {

  return true;
};

/**
    *
    * @param delta
    * @returns {boolean}
    */
proto.handleWheelInput = function (delta) {

  return false;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleSingleTap = function (event) {

  return false;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleDoubleTap = function (event) {

  return false;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleBlur = function (event) {

  return false;
};

/***/ }),

/***/ "./extensions/BimWalk/Navigators/NavigatorMobile.js":
/*!**********************************************************!*\
  !*** ./extensions/BimWalk/Navigators/NavigatorMobile.js ***!
  \**********************************************************/
/*! exports provided: NavigatorMobile */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NavigatorMobile", function() { return NavigatorMobile; });
/* harmony import */ var _NavigatorSimple__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NavigatorSimple */ "./extensions/BimWalk/Navigators/NavigatorSimple.js");
/* harmony import */ var _UI_NavigatorMobileJoystick__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../UI/NavigatorMobileJoystick */ "./extensions/BimWalk/UI/NavigatorMobileJoystick.js");
/* harmony import */ var _BimWalkPools__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BimWalkPools */ "./extensions/BimWalk/BimWalkPools.js");
/* harmony import */ var _BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../BimWalkUtils */ "./extensions/BimWalk/BimWalkUtils.js");





var temporalMousePosition = { x: 0, y: 0 };
var MOBILE_SPEED_FACTOR = 15.0;

/**
                                 *
                                 * @constructor
                                 */
function NavigatorMobile(tool) {

  _NavigatorSimple__WEBPACK_IMPORTED_MODULE_0__["NavigatorSimple"].call(this, tool);

  this.configuration.keyboardTopTurnSpeed = 0.5;
  this.configuration.keyboardTurnStopDuration = 0.4;

  this.ui = new _UI_NavigatorMobileJoystick__WEBPACK_IMPORTED_MODULE_1__["NavigatorMobileJoystick"](this.viewer, this, tool.options.joystickOptions);
}

NavigatorMobile.prototype = Object.create(_NavigatorSimple__WEBPACK_IMPORTED_MODULE_0__["NavigatorSimple"].prototype);
NavigatorMobile.prototype.constructor = NavigatorMobile;

var proto = NavigatorMobile.prototype;

/**
                                        *
                                        * @param elapsed
                                        */
proto.updateKeyboardDisplacement = function (elapsed) {

  var running = this.running;
  var moveForward = this.moveForward;
  var moveBackward = this.moveBackward;

  // Update acceleration.
  var topSpeed = running ? this.getTopRunSpeed() : this.get('topWalkSpeed');
  var velocity = this.moveKeyboardVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])();
  var accelerationModule = topSpeed * MOBILE_SPEED_FACTOR;

  var moving =
  moveForward !== 0 ||
  moveBackward !== 0;

  if (moving) {

    var camera = this.tool.camera;
    var upVector = camera.worldup;
    var speed = Math.max(this.moveForward, this.moveBackward);

    var directionForward = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["getForward"])(camera);
    var directionForwardXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])(directionForward);
    directionForwardXZ.sub(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])(upVector).multiplyScalar(upVector.dot(directionForward)));
    directionForwardXZ.normalize();

    var directionBackwardXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])(directionForwardXZ).multiplyScalar(-1);

    acceleration.add(directionForwardXZ.multiplyScalar(moveForward));
    acceleration.add(directionBackwardXZ.multiplyScalar(moveBackward));
    acceleration.normalize();

    velocity.copy(acceleration).multiplyScalar(speed);
    acceleration.multiplyScalar(accelerationModule * Math.max(this.moveForward, this.moveBackward));
  }

  // Decelerate if stop running.
  var deceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])();
  if (!running && velocity.lengthSq() > topSpeed * topSpeed) {

    deceleration.copy(velocity).normalize();
    deceleration.multiplyScalar(-this.getTopRunSpeed() / 1);

    acceleration.copy(deceleration);
  }

  // Update friction contribution.
  var frictionPresent = !moving && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  var clampToTopSpeed = deceleration.lengthSq() === 0;
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["updateVelocity"])(elapsed, acceleration, topSpeed, clampToTopSpeed, frictionPresent, velocity);
};

/**
    *
    * @param elapsed
    */
proto.updateKeyboardAngularVelocity = function (elapsed) {

  var topSpeed = this.get('keyboardTopTurnSpeed');
  var stopDuration = this.get('keyboardTurnStopDuration');
  var velocity = this.angularKeyboardVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_2__["getTempVector"])();
  var accelerationModule = topSpeed / stopDuration;
  var turning = this.turningWithKeyboard;


  // Update angular acceleration.
  if (turning) {

    var speed = Math.min(topSpeed, Math.max(this.moveLeft, this.moveRight) + accelerationModule * elapsed);

    velocity.y = 0;
    velocity.y -= this.moveLeft;
    velocity.y += this.moveRight;

    velocity.normalize().multiplyScalar(speed);
  }

  // Update friction contribution.
  var friction = !turning && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["updateVelocity"])(elapsed, acceleration, topSpeed, true, friction, velocity);
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleMouseMove = function (event) {

  var prevMousePosition = this.mousePosition;
  var currMousePosition = temporalMousePosition;

  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_3__["getMousePosition"])(event, this.viewer, currMousePosition);

  if (this.turningWithMouse) {

    this.turnMouseDelta.x -= currMousePosition.x - prevMousePosition.x;
    this.turnMouseDelta.y -= currMousePosition.y - prevMousePosition.y;
  }

  this.mousePosition.copy(currMousePosition);
  return true;
};

/***/ }),

/***/ "./extensions/BimWalk/Navigators/NavigatorSimple.js":
/*!**********************************************************!*\
  !*** ./extensions/BimWalk/Navigators/NavigatorSimple.js ***!
  \**********************************************************/
/*! exports provided: NavigatorSimple */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NavigatorSimple", function() { return NavigatorSimple; });
/* harmony import */ var _Navigator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./Navigator */ "./extensions/BimWalk/Navigators/Navigator.js");
/* harmony import */ var _BimWalkPools__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../BimWalkPools */ "./extensions/BimWalk/BimWalkPools.js");
/* harmony import */ var _BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../BimWalkUtils */ "./extensions/BimWalk/BimWalkUtils.js");
/* harmony import */ var _UI_NavigatorSimple__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../UI/NavigatorSimple */ "./extensions/BimWalk/UI/NavigatorSimple.js");





var EPSILON = 0.0001;
var temporalMousePosition = { x: 0, y: 0 };

/**
                                             *
                                             * @constructor
                                             */
function NavigatorSimple(tool) {

  _Navigator__WEBPACK_IMPORTED_MODULE_0__["Navigator"].call(this, tool);

  // Set initial configurable values.
  this.configuration = {

    // Walk and run.
    minWalkSpeed: 2,
    maxWalkSpeed: 6,
    topWalkSpeed: 4,
    minRunSpeed: 4,
    maxRunSpeed: 12,
    runMultiplier: 2,

    // Walk with mouse.
    mouseWalkMaxTargetDistance: 2,
    mouseWalkStopDuration: 0.5,

    // Vertical movement with mouse.
    topVerticalSpeed: 2,
    topVerticalSpeedMultiplier: 1.5,
    allowVerticalSuspension: false,

    // Turning with keyboard.
    keyboardTopTurnSpeed: 1.5,
    keyboardTurnStopDuration: 0.75,

    // Turning with mouse.
    mouseTurnInverted: false,
    mouseTurnStopDuration: 0.2,
    mouseTurnMinPitchLimit: THREE.Math.degToRad(20),
    mouseTurnMaxPitchLimit: THREE.Math.degToRad(160),

    // Teleport.
    teleportDuration: 0.5,
    teleportWallDistance: 1.0,

    cameraDistanceFromFloor: 1.8,
    minAllowedRoofDistance: 0.6,
    smallAllowedVerticalStep: 0.3,
    bigAllowedVerticalStep: 0.6,
    minFloorSidesLengthForBigVerticalStep: 5,

    gravityUpdatesBeforeFalling: 10,
    gravityAcceleration: 9.8,
    gravityTopFallSpeed: 10 };


  this.modelToMeters = 1;
  this.metersToModel = 1;

  this.keys = Autodesk.Viewing.KeyCode;
  this.mousePosition = new THREE.Vector2(0, 0);

  // Keyboard displacement
  this.moveForward = 0;
  this.moveBackward = 0;
  this.moveLeft = 0;
  this.moveRight = 0;

  this.moveKeyboardVelocity = new THREE.Vector3();

  // Mouse displacement.
  this.moveMouseTargetDistance = 0;
  this.moveMouseLastWheelDelta = 0;
  this.moveMouseVelocity = new THREE.Vector3();
  this.moveMouseLastVelocity = new THREE.Vector3();
  this.mouseForwardDirection = new THREE.Ray();

  // Turn with rotations.
  this.turningWithMouse = false;
  this.turnMouseDelta = new THREE.Vector3();
  this.turnMouseLastVelocity = new THREE.Vector3();

  // Turn with Keyboard.
  this.turnLeft = 0;
  this.turnRight = 0;

  this.angularKeyboardVelocity = new THREE.Vector3();
  this.angularMouseVelocity = new THREE.Vector3();

  // Between floors displacement.
  this.moveUp = 0;
  this.moveDown = 0;

  this.moveUpDownKeyboardVelocity = new THREE.Vector3();

  // Gravity displacement.
  this.gravityEnabled = true;

  // While moving up/down, gravity is temporarily blocked (even if enabled)
  this.movingUpOrDown = false;

  this.userOverFloor = false;
  this.gravityVelocity = new THREE.Vector3();
  this.updatesToStartFalling = 0;

  // Teleport.
  this.teleporting = false;
  this.teleportInitial = new THREE.Vector3();
  this.teleportTarget = new THREE.Vector3();

  this.teleportTime = 0;
  this.teleportVelocity = new THREE.Vector3();
  this.teleportedDistance = 0;

  this.ui = new _UI_NavigatorSimple__WEBPACK_IMPORTED_MODULE_3__["NavigatorSimple"](this);
}

NavigatorSimple.prototype = Object.create(_Navigator__WEBPACK_IMPORTED_MODULE_0__["Navigator"].prototype);
NavigatorSimple.prototype.constructor = NavigatorSimple;

var proto = NavigatorSimple.prototype;

/**
                                        *
                                        * @param configuration
                                        * @param value
                                        * @returns {boolean}
                                        */
proto.set = function (configuration, value) {

  var result = _Navigator__WEBPACK_IMPORTED_MODULE_0__["Navigator"].prototype.set.call(this, configuration, value);

  // Ensure top walk speed stays in it's limits.
  var minWalkSpeed = this.get('minWalkSpeed');
  var maxWalkSpeed = this.get('maxWalkSpeed');

  this.configuration.topWalkSpeed = Math.min(Math.max(
  this.configuration.topWalkSpeed, minWalkSpeed), maxWalkSpeed);
  return result;
};

/**
    *
    * @param configuration
    * @param value
    * @returns {boolean}
    */
proto.getTopRunSpeed = function () {

  var minRunSpeed = this.get('minRunSpeed');
  var maxRunSpeed = this.get('maxRunSpeed');

  var speed = this.get('topWalkSpeed') * this.get('runMultiplier');
  return Math.min(Math.max(speed, minRunSpeed, maxRunSpeed));
};

/**
    * 
    * @returns {Number}
    */
proto.getMinPitchLimit = function () {

  return this.get('mouseTurnMinPitchLimit');
};

/**
    * 
    * @returns {Number}
    */
proto.getMaxPitchLimit = function () {

  return this.get('mouseTurnMaxPitchLimit');
};

/**
    *
    *
    */
proto.activate = function () {

  this.metersToModel = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["metersToModel"])(1, this.viewer);
  this.modelToMeters = 1 / this.metersToModel;
  this.userOverFloor = false;

  this.ui.activate();
};

/**
    *
    *
    */
proto.deactivate = function () {

  this.ui.deactivate();
};

/**
    *
    *
    */
proto.enableGravity = function (enable) {

  if (this.gravityEnabled === enable) {
    return;
  }

  this.gravityEnabled = enable;
  this.resetGravity();
};

proto.resetGravity = function () {
  this.gravityVelocity.set(0, 0, 0);
  this.userOverFloor = false;
  this.updatesToStartFalling = Number.MAX_VALUE;
};

/**
    *
    * @param elapsed
    * @param camera
    * @param updateNumber
    * @param updatesCount
    */
proto.update = function (elapsed, camera, updateNumber, updatesCount) {

  this.velocity.set(0, 0, 0);
  this.angularVelocity.set(0, 0, 0);

  if (this.ui.isDialogOpen && this.ui.isDialogOpen()) {
    return;
  }

  if (this.viewer.autocam.currentlyAnimating) {
    this.userOverFloor = false;
    this.updatesToStartFalling = this.get('gravityUpdatesBeforeFalling');
    return;
  }

  if (this.teleporting) {

    // Update displacement velocity.
    this.updateTeleportDisplacement(elapsed);
    this.velocity.add(this.teleportVelocity);
  } else {

    // Update displacement velocity.
    this.updateKeyboardUpDownDisplacement(elapsed);

    this.updateGravityDisplacement(elapsed, camera, updateNumber, updatesCount);

    this.updateKeyboardDisplacement(elapsed);
    this.updateMouseDisplacement(elapsed);

    this.velocity.add(this.gravityVelocity);
    this.velocity.add(this.moveUpDownKeyboardVelocity);
    this.velocity.add(this.moveKeyboardVelocity);
    this.velocity.add(this.moveMouseVelocity);

    // Update angular velocity.
    this.updateKeyboardAngularVelocity(elapsed);
    this.updateMouseAngularVelocity(elapsed);

    this.angularVelocity.add(this.angularKeyboardVelocity);
    this.angularVelocity.add(this.angularMouseVelocity);
  }
};

/**
    *
    * @param elapsed
    */
proto.updateTeleportDisplacement = function (elapsed) {

  var initial = this.teleportInitial;
  var target = this.teleportTarget;
  var duration = this.get('teleportDuration');
  var velocity = this.teleportVelocity;

  this.teleportTime = Math.min(duration, this.teleportTime + elapsed);
  var lerp = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["easeInOutQuad"])(this.teleportTime, 0, 1, duration);

  var newDisplacement = initial.distanceTo(target) * lerp;
  var oldDisplacement = this.teleportedDistance;

  this.teleportedDistance = newDisplacement;

  if (lerp === 1) {

    this.teleporting = false;
    this.teleportTime = 0;
    this.teleportedDistance = 0;
  }

  velocity.copy(target);
  velocity.sub(initial).normalize();
  velocity.multiplyScalar((newDisplacement - oldDisplacement) * this.modelToMeters / elapsed);
};

proto.updateGravityDisplacement = function (elapsed, camera, updateNumber, updatesCount) {

  var viewer = this.viewer;
  var worldDown = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.worldup).multiplyScalar(-1);
  var velocity = this.gravityVelocity;
  var onFloor = this.userOverFloor;

  // It's assumed the user is still over a floor if it was during the previous frame and he didn't move.
  this.userOverFloor =
  this.userOverFloor &&
  this.moveMouseVelocity.lengthSq() === 0 &&
  this.moveKeyboardVelocity.lengthSq() === 0 &&
  this.moveUpDownKeyboardVelocity.lengthSq() === 0;

  if (!this.gravityEnabled || this.movingUpOrDown) {
    return;
  }

  if (this.userOverFloor) {

    // Position is not updated by the navigator, we stop movement at the beginning of the next frame
    // the floor was found and the user was moved over it.
    velocity.set(0, 0, 0);
    return;
  }

  // Get floor candidates.
  var candidates = [];
  var obstacles = [];
  var metersToModel = this.metersToModel;
  var cameraDistanceFromFloor = this.get('cameraDistanceFromFloor');
  var minAllowedRoofDistance = this.get('minAllowedRoofDistance');
  var smallAllowedVerticalStep = this.get('smallAllowedVerticalStep');
  var bigAllowedVerticalStep = this.get('bigAllowedVerticalStep');
  var minFloorSidesLengthForBigVerticalStep = this.get('minFloorSidesLengthForBigVerticalStep');

  var bestCandidateIndex = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getFloorCandidates"])(
  camera.position,
  cameraDistanceFromFloor * metersToModel,
  minAllowedRoofDistance * metersToModel,
  smallAllowedVerticalStep * metersToModel,
  bigAllowedVerticalStep * metersToModel,
  minFloorSidesLengthForBigVerticalStep * metersToModel,
  viewer,
  candidates,
  obstacles);

  // There is no floor, so there is no falling at all, keeping same camera height.
  if (bestCandidateIndex === -1 || obstacles.length > 0) {
    velocity.set(0, 0, 0);
    return;
  }

  // Fall into the floor or stay over it if distance is less that epsilon.
  var candidate = candidates[bestCandidateIndex];
  var candidateDistance = candidate.point.distanceTo(camera.position) * this.modelToMeters;
  var deltaFeetToCandidate = candidateDistance - cameraDistanceFromFloor;

  if (deltaFeetToCandidate < EPSILON || Math.abs(deltaFeetToCandidate) < smallAllowedVerticalStep) {

    velocity.copy(worldDown).multiplyScalar(deltaFeetToCandidate / elapsed);
    this.userOverFloor = true;
    this.updatesToStartFalling = 0;
  } else {

    if (this.updatesToStartFalling++ < this.get('gravityUpdatesBeforeFalling')) {
      return;
    }

    var acceleration = this.get('gravityAcceleration');
    var topFallSpeed = this.get('gravityTopFallSpeed');
    var speed = Math.min(topFallSpeed, velocity.length() + acceleration * elapsed);

    velocity.copy(worldDown.multiplyScalar(speed));
  }
};

/**
    *
    * @param elapsed
    */
proto.updateKeyboardUpDownDisplacement = function (elapsed) {

  var tool = this.tool;
  var running = this.running;

  var moveUp = this.moveUp;
  var moveDown = this.moveDown;

  // Update acceleration.
  var topSpeed = this.get('topVerticalSpeed') * (running ? this.get('topVerticalSpeedMultiplier') : 1);
  var velocity = this.moveUpDownKeyboardVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  var accelerationModule = topSpeed / 1;

  var moving = moveUp !== 0 || moveDown !== 0;
  var suspendMoving = this.get('allowVerticalSuspension') && this.moveKeyboardVelocity.lengthSq() > 0;

  if (moving && !suspendMoving) {

    var upVector = tool.camera.worldup;
    var speed = velocity.length();

    var directionUp = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(upVector);
    var directionDown = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(upVector).multiplyScalar(-1);

    acceleration.add(directionUp.multiplyScalar(moveUp));
    acceleration.add(directionDown.multiplyScalar(moveDown));
    acceleration.normalize();

    velocity.copy(acceleration).multiplyScalar(speed);
    acceleration.multiplyScalar(accelerationModule);
  } else {

    velocity.set(0, 0, 0);
  }

  // When starting or ending vertical move, reset gravity
  if (this.gravityEnabled && moving != this.movingUpOrDown) {
    this.resetGravity();
  }

  // Remember movement state: This blocks gravity during while moving and 
  // is used to detect changes between moving/not-moving.
  this.movingUpOrDown = moving;

  // Decelerate if stop running.
  var deceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  if (!running && velocity.lengthSq() > topSpeed * topSpeed) {

    deceleration.copy(velocity).normalize();
    deceleration.multiplyScalar(-this.getTopRunSpeed() / 1);

    acceleration.copy(deceleration);
  }

  // Update velocity.
  var frictionPresent = false;
  var clampToTopSpeed = deceleration.lengthSq() === 0;
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateVelocity"])(elapsed, acceleration, topSpeed, clampToTopSpeed, frictionPresent, velocity);
};

/**
    *
    * @param elapsed
    */
proto.updateKeyboardDisplacement = function (elapsed) {

  var tool = this.tool;
  var running = this.running;

  var moveForward = this.moveForward;
  var moveBackward = this.moveBackward;
  var moveLeft = this.moveLeft;
  var moveRight = this.moveRight;

  // Update acceleration.
  var topSpeed = running ? this.getTopRunSpeed() : this.get('topWalkSpeed');
  var velocity = this.moveKeyboardVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  var accelerationModule = topSpeed / 1;

  var moving =
  moveForward !== 0 ||
  moveBackward !== 0 ||
  moveLeft !== 0 ||
  moveRight !== 0;

  if (moving) {

    var camera = this.tool.camera;
    var upVector = camera.worldup;
    var speed = velocity.length();

    var directionForward = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getForward"])(camera);
    var directionForwardXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(directionForward);
    directionForwardXZ.sub(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(upVector).multiplyScalar(upVector.dot(directionForward)));
    directionForwardXZ.normalize();

    var directionRight = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(directionForward).cross(upVector).normalize();
    var directionRightXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(directionRight);
    directionRightXZ.sub(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(upVector).multiplyScalar(upVector.dot(directionRight)));
    directionRightXZ.normalize();

    var directionBackwardXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(directionForwardXZ).multiplyScalar(-1);
    var directionLeftXZ = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(directionRight).multiplyScalar(-1);

    acceleration.add(directionForwardXZ.multiplyScalar(moveForward));
    acceleration.add(directionBackwardXZ.multiplyScalar(moveBackward));
    acceleration.add(directionRightXZ.multiplyScalar(moveRight));
    acceleration.add(directionLeftXZ.multiplyScalar(moveLeft));
    acceleration.normalize();

    velocity.copy(acceleration).multiplyScalar(speed);
    acceleration.multiplyScalar(accelerationModule);
  }

  // Decelerate if stop running.
  var deceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  if (!running && velocity.lengthSq() > topSpeed * topSpeed) {

    deceleration.copy(velocity).normalize();
    deceleration.multiplyScalar(-this.getTopRunSpeed() / 1);

    acceleration.copy(deceleration);
  }

  // Update friction contribution.
  var frictionPresent = !moving && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  var clampToTopSpeed = deceleration.lengthSq() === 0;
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateVelocity"])(elapsed, acceleration, topSpeed, clampToTopSpeed, frictionPresent, velocity);
};

/**
    *
    * @param elapsed
    */
proto.updateMouseDisplacement = function (elapsed) {

  var topSpeed = this.getTopRunSpeed();
  var target = this.moveMouseTargetDistance;
  var velocity = this.moveMouseVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  var moving = this.moveMouseTargetDistance !== 0;
  var accelerationModule =
  (moving ? topSpeed : this.moveMouseLastVelocity.length()) / this.get('mouseWalkStopDuration');

  // Update acceleration module.
  if (moving) {

    var camera = this.tool.camera;
    var upVector = camera.worldup;

    var ray = this.mouseForwardDirection;
    var targetPosition = this.viewer.impl.clientToViewport(this.mousePosition.x, this.mousePosition.y);
    this.viewer.impl.viewportToRay(targetPosition, ray);

    var direction = ray.direction;
    direction.sub(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(upVector).multiplyScalar(upVector.dot(direction)));
    direction.normalize();

    if (target > 0) {
      direction.multiplyScalar(-1);
    }

    var speed = velocity.length() + accelerationModule * elapsed;
    velocity.copy(direction.multiplyScalar(speed));

    this.moveMouseLastVelocity.copy(velocity);
  }

  // Update friction contribution.
  var frictionPresent = !moving && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateVelocity"])(elapsed, acceleration, topSpeed, true, frictionPresent, velocity);

  // Update distance traveled.
  if (moving) {
    var displacement = velocity.length() * elapsed;
    this.moveMouseTargetDistance += target < 0 ? displacement : -displacement;
    if (this.moveMouseTargetDistance * target < 0) {
      this.moveMouseTargetDistance = 0;
    }
  }
};

/**
    *
    * @param elapsed
    */
proto.updateKeyboardAngularVelocity = function (elapsed) {

  var topSpeed = this.get('keyboardTopTurnSpeed');
  var stopDuration = this.get('keyboardTurnStopDuration');
  var velocity = this.angularKeyboardVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  var accelerationModule = topSpeed / stopDuration;

  // Update angular acceleration.
  var turning = this.turnLeft !== 0 || this.turnRight !== 0;
  if (turning) {

    var speed = Math.min(topSpeed, velocity.length() + accelerationModule * elapsed);

    velocity.y = 0;
    velocity.y -= this.turnLeft;
    velocity.y += this.turnRight;

    velocity.normalize().multiplyScalar(speed);
  }

  // Update friction contribution.
  var friction = !turning && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateVelocity"])(elapsed, acceleration, topSpeed, true, friction, velocity);
};

/**
   *
   * @param elapsed
   */
proto.updateMouseAngularVelocity = function (elapsed) {

  var stopDuration = this.get('mouseTurnStopDuration');
  var velocity = this.angularMouseVelocity;
  var acceleration = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])();
  var accelerationModule = this.turnMouseLastVelocity.length() / stopDuration;

  // Update mouse angular acceleration.
  var camera = this.tool.camera;
  var delta = this.turnMouseDelta;
  var turning = delta.lengthSq() > 0;

  if (turning) {

    var MAGIC_NUMBER = 1 / (this.get('mouseTurnInverted') ? 800 : 200);

    var dx = -delta.y * MAGIC_NUMBER;
    var dy = -delta.x * MAGIC_NUMBER;

    delta.set(0, 0, 0);

    // Average velocity with previous one.
    velocity.add(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])().set(dx / elapsed, dy / elapsed, 0));
    velocity.multiplyScalar(0.5);

    this.turnMouseLastVelocity.copy(velocity);
  }

  // Update friction contribution.
  var friction = !turning && Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateFriction"])(accelerationModule, velocity, acceleration);

  // Update velocity.
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["updateVelocity"])(elapsed, acceleration, 0, false, friction, velocity);
};

/**
    *
    *
    */
proto.getCursor = function () {

  if (Autodesk.Viewing.isIE11) {
    return null; // Custom cursors don't work in MS platforms, so we set the default one.
  }

  if (this.get('mouseTurnInverted')) {

    if (this.turningWithMouse) {
      return 'url(), auto';
    } else {
      return 'url(), auto';
    }
  } else {
    return "url() 16 16, auto";
  }
};

proto.ignoreInput = function () {

  return this.teleporting;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleButtonDown = function (event, button) {

  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getMousePosition"])(event, this.viewer, this.mousePosition);

  if (button === 0) {

    this.turningWithMouse = true;
    this.turnMouseDelta.set(0, 0, 0);
  }

  return true;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleButtonUp = function (event, button) {

  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getMousePosition"])(event, this.viewer, this.mousePosition);

  if (button === 0) {
    this.turningWithMouse = false;
  }

  return true;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleMouseClick = function (event, button) {

  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getMousePosition"])(event, this.viewer, this.mousePosition);
  return true;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleMouseDoubleClick = function (event, button) {

  var onFloorFound = function (intersection) {

    this.teleporting = true;
    this.teleportTime = 0;

    var camera = this.viewer.impl.camera;

    // Set intial position to current camera position.
    this.teleportInitial.copy(camera.position);

    // Set target position, collision plus camera's height.
    var cameraUp = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.worldup);
    cameraUp.multiplyScalar(this.get('cameraDistanceFromFloor') * this.metersToModel);

    this.teleportTarget.copy(intersection.intersectPoint).add(cameraUp);

    // On floor teleport ends on the spot.
    this.teleportVelocity.set(0, 0, 0);
  }.bind(this);

  var onWallFound = function (intersection) {

    var viewer = this.viewer;
    var camera = this.viewer.impl.camera;
    var metersToModel = this.metersToModel;
    var cameraDistanceFromFloor = this.get('cameraDistanceFromFloor');
    var feetToCameraDelta = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.worldup).multiplyScalar(cameraDistanceFromFloor * metersToModel);

    // Set intial position to current camera position.
    var initial = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.position);

    // Set target position to collision displaced the teleport distance at floor level.
    var direction = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(intersection.intersectPoint);
    direction.sub(camera.position);
    Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["setWorldUpComponent"])(camera, direction, 0).normalize();

    var target = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(intersection.intersectPoint);
    target.add(direction.multiplyScalar(this.get('teleportWallDistance') * metersToModel));
    target.add(feetToCameraDelta);

    // Get floor candidates.
    var candidates = [];
    var minAllowedRoofDistance = this.get('minAllowedRoofDistance');
    var bigAllowedVerticalStep = this.get('bigAllowedVerticalStep');
    var minFloorSidesLengthForBigVerticalStep = this.get('minFloorSidesLengthForBigVerticalStep');

    var bestCandidateIndex = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getFloorCandidates"])(
    target,
    cameraDistanceFromFloor * metersToModel,
    minAllowedRoofDistance * metersToModel,
    0,
    bigAllowedVerticalStep * metersToModel,
    minFloorSidesLengthForBigVerticalStep * metersToModel,
    viewer,
    candidates);

    // There is no floor, so there is no falling at all, keeping same camera height.
    if (bestCandidateIndex === -1) {
      return;
    }

    // Target is the best floor candidate displaced by the distance from floor.
    target.copy(candidates[bestCandidateIndex].point).add(feetToCameraDelta);

    this.teleporting = true;
    this.teleportTime = 0;
    this.teleportInitial.copy(initial);
    this.teleportTarget.copy(target);
  }.bind(this);

  if (this.teleporting) {
    return true;
  }
  var viewer = this.viewer;
  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getMousePosition"])(event, viewer, this.mousePosition);

  var mousePosition = this.mousePosition;
  var viewerportPosition = viewer.impl.clientToViewport(mousePosition.x, mousePosition.y);
  var intersections = [];
  var camera = viewer.impl.camera;
  var worldUp = camera.worldup;

  // No intersection with geometry.
  var intersection = viewer.impl.castRayViewport(viewerportPosition, false, false, false);
  if (intersection && intersection.face) {

    var normal = intersection.face.normal.normalize();
    var cos = worldUp.dot(normal);

    if (Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["isFloorIntersection"])(intersection, camera)) {
      onFloorFound(intersection);
    }

    if (Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["isWallIntersection"])(intersection, camera)) {
      onWallFound(intersection);
    }
  }

  return true;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleMouseMove = function (event) {

  var prevMousePosition = this.mousePosition;
  var currMousePosition = temporalMousePosition;

  Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getMousePosition"])(event, this.viewer, currMousePosition);

  if (this.turningWithMouse) {

    if (this.get('mouseTurnInverted')) {
      this.turnMouseDelta.x += currMousePosition.x - prevMousePosition.x;
      this.turnMouseDelta.y += currMousePosition.y - prevMousePosition.y;
    } else {
      this.turnMouseDelta.x -= currMousePosition.x - prevMousePosition.x;
      this.turnMouseDelta.y -= currMousePosition.y - prevMousePosition.y;
    }
  }

  this.mousePosition.copy(currMousePosition);
  return true;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleGesture = function (event) {

  // Convert Hammer touch-event X,Y into mouse-event X,Y.
  if (event.pointers && event.pointers.length > 0) {
    event.pageX = event.pointers[0].pageX;
    event.pageY = event.pointers[0].pageY;
  }

  var handled = false;

  switch (event.type) {
    case "dragstart":
      // Single touch, fake the mouse for now...
      handled = this.handleButtonDown(event, 0);
      break;

    case "dragmove":
      handled = this.handleMouseMove(event);
      break;

    case "dragend":
      handled = this.handleButtonUp(event, 0);
      break;

    case "pinchstart":
      return true;

    case "pinchmove":
      return true;

    case "pinchend":
      return true;}


  return handled;
};

/**
    *
    * @param event
    * @param keyCode
    * @returns {boolean}
    */
proto.handleKeyDown = function (event, keyCode) {

  var handled = true;
  switch (keyCode) {
    case this.keys.SHIFT:
      this.running = true;
      break;

    case this.keys.DASH:
      var topSpeed = this.get('topWalkSpeed') - 1;
      this.tool.set('topWalkSpeed', topSpeed);
      break;

    case this.keys.EQUALS:
    case this.keys.PLUS:

    case this.keys.PLUSMOZ:
      var topSpeed = this.get('topWalkSpeed') + 1;
      this.tool.set('topWalkSpeed', topSpeed);
      break;

    case this.keys.CONTROL:
    case this.keys.ALT:
      break;

    case this.keys.SPACE:
      this.enableGravity(!this.gravityEnabled);
      break;

    case this.keys.UP:
    case this.keys.w:
      this.moveForward = 1.0;
      break;

    case this.keys.LEFT:
      this.turnLeft = 1.0;
      break;

    case this.keys.RIGHT:
      this.turnRight = 1.0;
      break;

    case this.keys.DOWN:
    case this.keys.s:
      this.moveBackward = 1.0;
      break;

    case this.keys.a:
      this.moveLeft = 1.0;
      break;

    case this.keys.d:
      this.moveRight = 1.0;
      break;

    case this.keys.e:
      this.moveUp = 1.0;
      break;

    case this.keys.q:
      this.moveDown = 1.0;
      break;

    default:
      handled = false;
      break;}


  this.running = event.shiftKey;
  if (this.ui.onKeyDown) {
    handled |= this.ui.onKeyDown(event, keyCode);

  }

  return handled;
};

/**
    *
    * @param event
    * @param keyCode
    * @returns {boolean}
    */
proto.handleKeyUp = function (event, keyCode) {

  var moveToFloor = function () {

    var viewer = this.viewer;
    var camera = this.viewer.impl.camera;
    var metersToModel = this.metersToModel;
    var cameraDistanceFromFloor = this.get('cameraDistanceFromFloor');
    var feetToCameraDelta = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.worldup).multiplyScalar(cameraDistanceFromFloor * metersToModel);

    // Set intial position to current camera position.
    var initial = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.position);

    // Set target position to collision displaced the teleport distance at floor level.
    var direction = camera.worldup;

    var target = Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.position);
    target.add(Object(_BimWalkPools__WEBPACK_IMPORTED_MODULE_1__["getTempVector"])(camera.worldup).multiplyScalar(1.5 * metersToModel));

    // Get floor candidates.
    var candidates = [];
    var minAllowedRoofDistance = this.get('minAllowedRoofDistance');
    var bigAllowedVerticalStep = this.get('bigAllowedVerticalStep');
    var minFloorSidesLengthForBigVerticalStep = this.get('minFloorSidesLengthForBigVerticalStep');

    var bestCandidateIndex = Object(_BimWalkUtils__WEBPACK_IMPORTED_MODULE_2__["getFloorCandidates"])(
    target,
    cameraDistanceFromFloor * metersToModel,
    Number.MAX_SAFE_INTEGER,
    0,
    0,
    minFloorSidesLengthForBigVerticalStep * metersToModel,
    viewer,
    candidates);

    // There is no floor, so there is no falling at all, keeping same camera height.
    if (bestCandidateIndex === -1) {
      return;
    }

    // Target is the best floor candidate displaced by the distance from floor.
    target.copy(candidates[bestCandidateIndex].point).add(feetToCameraDelta);

    this.teleporting = true;
    this.teleportTime = 0;
    this.teleportInitial.copy(initial);
    this.teleportTarget.copy(target);
  }.bind(this);

  var handled = true;
  var moveUp = this.moveUp;
  var moveDown = this.moveDown;

  switch (keyCode) {

    case this.keys.SHIFT:
      this.running = false;
      break;

    case this.keys.CONTROL:
    case this.keys.ALT:
      break;

    case this.keys.SPACE:
      break;

    case this.keys.UP:
    case this.keys.w:
      this.moveForward = 0;
      break;

    case this.keys.LEFT:
      this.turnLeft = 0;
      break;

    case this.keys.RIGHT:
      this.turnRight = 0;
      break;

    case this.keys.DOWN:
    case this.keys.s:
      this.moveBackward = 0;
      break;

    case this.keys.a:
      this.moveLeft = 0;
      break;

    case this.keys.d:
      this.moveRight = 0;
      break;

    case this.keys.e:
      this.moveUp = 0;
      break;

    case this.keys.q:
      this.moveDown = 0;
      break;

    default:
      handled = false;
      break;}


  if (this.moveUp === 0 && this.moveDown === 0 && (this.moveUp !== moveUp || this.moveDown !== moveDown)) {
    // If gravity is disabled, just keep current altitude.
    if (this.gravityEnabled) {
      moveToFloor();
    }
  }

  this.running = event.shiftKey;
  return handled;
};

/**
    *
    * @param delta
    * @returns {boolean}
    */
proto.handleWheelInput = function (delta) {

  // If user changes wheel direction, target distance switches directions.
  if (this.tool.navapi.getReverseZoomDirection()) {
    delta *= -1;
  }

  // Add delta to target distance until filling the maximum allowed.
  var curTargetDistance = this.moveMouseTargetDistance;
  var maxTargetDistance = this.get('mouseWalkMaxTargetDistance');

  var MAGIC_NUMBER = 0.5;
  var target = Math.min(maxTargetDistance, Math.abs(curTargetDistance + delta * MAGIC_NUMBER)) * (delta > 0 ? 1 : -1);

  this.moveMouseTargetDistance = target;
  return true;
};

/**
    *
    * @param event
    * @param button
    * @returns {boolean}
    */
proto.handleSingleClick = function (event, button) {

  return true;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleSingleTap = function (event) {

  return true;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleDoubleTap = function (event) {

  return true;
};

/**
    *
    * @param event
    * @returns {boolean}
    */
proto.handleBlur = function (event) {

  // Reset things when we lose focus...
  this.moveForward = this.moveBackward = 0;
  this.moveLeft = this.moveRight = 0;
  this.moveUp = this.moveDown = 0;

  return false;
};

/***/ }),

/***/ "./extensions/BimWalk/UI/NavigatorMobileJoystick.css":
/*!***********************************************************!*\
  !*** ./extensions/BimWalk/UI/NavigatorMobileJoystick.css ***!
  \***********************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {


var content = __webpack_require__(/*! !../../../node_modules/css-loader!./NavigatorMobileJoystick.css */ "./node_modules/css-loader/index.js!./extensions/BimWalk/UI/NavigatorMobileJoystick.css");

if(typeof content === 'string') content = [[module.i, content, '']];

var transform;
var insertInto;



var options = {"hmr":true}

options.transform = transform
options.insertInto = undefined;

var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);

if(content.locals) module.exports = content.locals;

if(false) {}

/***/ }),

/***/ "./extensions/BimWalk/UI/NavigatorMobileJoystick.js":
/*!**********************************************************!*\
  !*** ./extensions/BimWalk/UI/NavigatorMobileJoystick.js ***!
  \**********************************************************/
/*! exports provided: NavigatorMobileJoystick */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NavigatorMobileJoystick", function() { return NavigatorMobileJoystick; });
/* harmony import */ var _NavigatorMobileJoystick_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NavigatorMobileJoystick.css */ "./extensions/BimWalk/UI/NavigatorMobileJoystick.css");
/* harmony import */ var _NavigatorMobileJoystick_css__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_NavigatorMobileJoystick_css__WEBPACK_IMPORTED_MODULE_0__);



function NavigatorMobileJoystick(viewer, navigator, options) {

  var _viewer = viewer;
  var _navigator = navigator;
  var _options = options || {};

  var _joystickContainer = null;
  var _joystickHandle = null;
  var _joystickBackCircle = null;

  var _arrowUp = null;
  var _arrowDown = null;
  var _arrowLeft = null;
  var _arrowRight = null;
  var _arrowSize = 20;
  var _arrowOffset = 20;

  var _backCircleRadius = _options.backCircleRadius || 72;
  var _frontCircleRadius = _options.frontCircleRadius || 36;
  var _offsetFromCornerRatio = _options.offsetFromCornerRatio || 8;
  var _threshold = _options.threshold || 0.1;
  var _joystickCenter = null;

  var _isDragging = false;

  _navigator.reverseDrag = -1;

  this.updateJoystickHandlePosition = function (x, y) {
    var v = new THREE.Vector2(x - _joystickCenter.x, y - _joystickCenter.y);
    var length = Math.min(v.length(), _backCircleRadius);
    v.normalize();
    v.multiplyScalar(length);
    v.add(_joystickCenter);

    _joystickHandle.style.left = v.x - _frontCircleRadius + 'px';
    _joystickHandle.style.top = v.y - _frontCircleRadius + 'px';

    return v;
  };

  this.changeJoystickColor = function (isFocused) {
    if (isFocused) {
      _joystickHandle.classList.toggle('focus', true);
      _joystickBackCircle.classList.toggle('focus', true);
      _joystickHandle.classList.remove('transition');
    } else {
      _joystickHandle.classList.remove('focus');
      _joystickBackCircle.classList.remove('focus');
      _joystickHandle.classList.toggle('transition', true);
    }
  };

  this.updateNavigator = function (pos) {
    var horizontalDelta = (_joystickCenter.x - pos.x) / _backCircleRadius;
    var verticalDelta = (_joystickCenter.y - pos.y) / _backCircleRadius;

    _navigator.moveForward = 0;
    _navigator.moveBackward = 0;
    _navigator.moveLeft = 0;
    _navigator.moveRight = 0;
    _navigator.turningWithKeyboard = false;

    if (verticalDelta > _threshold) {
      _navigator.moveForward = verticalDelta;
    } else
    if (verticalDelta < -_threshold) {
      _navigator.moveBackward = -verticalDelta;
    }

    if (horizontalDelta > _threshold) {
      _navigator.moveLeft = horizontalDelta;
      _navigator.turningWithKeyboard = true;
    } else
    if (horizontalDelta < -_threshold) {
      _navigator.moveRight = -horizontalDelta;
      _navigator.turningWithKeyboard = true;
    }
  };

  this.handleGesture = function (event) {
    var pos = null;

    switch (event.type) {

      case "dragstart":
        _isDragging = true;
        this.changeJoystickColor(true);
        pos = this.updateJoystickHandlePosition(event.center.x, event.center.y);
        break;

      case "dragmove":
        if (_isDragging) {
          this.changeJoystickColor(true);
          pos = this.updateJoystickHandlePosition(event.center.x, event.center.y);
        }
        break;

      case "dragend":
        if (_isDragging) {
          this.changeJoystickColor(false);
          pos = this.updateJoystickHandlePosition(_joystickCenter.x, _joystickCenter.y);
          _isDragging = false;
        }
        break;}


    this.updateNavigator(pos);
    event.preventDefault();
  };

  this.setJoystickPosition = function (x, y) {
    _joystickHandle.classList.remove('transition');

    _joystickCenter = new THREE.Vector2(x, y);
    _joystickHandle.style.left = _joystickCenter.x - _frontCircleRadius + 'px';
    _joystickHandle.style.top = _joystickCenter.y - _frontCircleRadius + 'px';
    _joystickContainer.style.left = _joystickCenter.x - _backCircleRadius + 'px';
    _joystickContainer.style.top = _joystickCenter.y - _backCircleRadius + 'px';

    _arrowUp.style.left = x - _arrowSize / 2 + 'px';
    _arrowUp.style.top = y - _frontCircleRadius - _arrowOffset - _arrowSize / 2 + 'px';

    _arrowDown.style.left = x - _arrowSize / 2 + 'px';
    _arrowDown.style.top = y + _frontCircleRadius + _arrowOffset - _arrowSize / 2 + 'px';

    _arrowRight.style.left = x + _frontCircleRadius + _arrowOffset - _arrowSize / 2 + 'px';
    _arrowRight.style.top = y - _arrowSize / 2 + 'px';

    _arrowLeft.style.left = x - _frontCircleRadius - _arrowOffset - _arrowSize / 2 + 'px';
    _arrowLeft.style.top = y - _arrowSize / 2 + 'px';
  };

  this.setJoystickPositionRelativeToCorner = function () {
    var xOffsetFromCorner = _viewer.container.clientWidth / _offsetFromCornerRatio;
    var yOffsetFromCorner = _viewer.container.clientHeight / _offsetFromCornerRatio;
    var centerX = xOffsetFromCorner + _backCircleRadius;
    var centerY = _viewer.container.clientHeight - _backCircleRadius - yOffsetFromCorner;
    this.setJoystickPosition(centerX, centerY);
  };

  this.setJoystickSize = function (backgroundRadius, handleRadius) {
    _backCircleRadius = backgroundRadius;
    _joystickBackCircle.style.width = _backCircleRadius * 2 + 'px';
    _joystickBackCircle.style.height = _backCircleRadius * 2 + 'px';

    _frontCircleRadius = handleRadius;
    _joystickHandle.style.width = _frontCircleRadius * 2 + 'px';
    _joystickHandle.style.height = _frontCircleRadius * 2 + 'px';

    if (_joystickCenter) {
      this.setJoystickPosition(_joystickCenter.x, _joystickCenter.y);
    }
  };

  this.init = function () {
    if (!_joystickContainer) {
      // joystick container
      _joystickContainer = document.createElement('div');
      _joystickContainer.className = 'mobile-joystick';
      _viewer.container.appendChild(_joystickContainer);

      // joystick background circle
      _joystickBackCircle = document.createElement('div');
      _joystickBackCircle.className = 'mobile-joystick mobile-joystick-back-circle';
      _joystickContainer.appendChild(_joystickBackCircle);

      // joystick handle
      _joystickHandle = document.createElement('div');
      _joystickHandle.className = 'mobile-joystick mobile-joystick-handle';
      this.changeJoystickColor(false);
      _joystickContainer.appendChild(_joystickHandle);

      /// Arrows                    
      _arrowUp = document.createElement('div');
      _arrowUp.className = 'mobile-joystick-arrow arrow-up';
      _arrowUp.style.width = _arrowSize + 'px';
      _arrowUp.style.height = _arrowSize + 'px';
      _joystickContainer.appendChild(_arrowUp);

      _arrowRight = document.createElement('div');
      _arrowRight.className = 'mobile-joystick-arrow arrow-right';
      _arrowRight.style.width = _arrowSize + 'px';
      _arrowRight.style.height = _arrowSize + 'px';
      _joystickContainer.appendChild(_arrowRight);

      _arrowDown = document.createElement('div');
      _arrowDown.className = 'mobile-joystick-arrow arrow-down';
      _arrowDown.style.width = _arrowSize + 'px';
      _arrowDown.style.height = _arrowSize + 'px';
      _joystickContainer.appendChild(_arrowDown);

      _arrowLeft = document.createElement('div');
      _arrowLeft.className = 'mobile-joystick-arrow arrow-left';
      _arrowLeft.style.width = _arrowSize + 'px';
      _arrowLeft.style.height = _arrowSize + 'px';
      _joystickContainer.appendChild(_arrowLeft);

      this.setJoystickSize(_backCircleRadius, _frontCircleRadius);
      this.setJoystickPositionRelativeToCorner();

      var av = Autodesk.Viewing;
      this.hammer = new av.Hammer.Manager(_joystickHandle, {
        recognizers: [
        av.GestureRecognizers.drag],

        handlePointerEventMouse: false,
        inputClass: av.isIE11 ? av.Hammer.PointerEventInput : av.Hammer.TouchInput });


      this.hammer.on("dragstart dragmove dragend", this.handleGesture.bind(this));

      this.onOrientationChanged = this.setJoystickPositionRelativeToCorner.bind(this);
    }
  };

  this.init();

  this.activate = function () {
    this.updateJoystickHandlePosition(_joystickCenter.x, _joystickCenter.y);
    _joystickContainer.classList.toggle('visible', true);
    window.addEventListener('resize', this.onOrientationChanged);
  };

  this.deactivate = function () {
    _joystickContainer.classList.remove('visible');
    _isDragging = false;
    window.removeEventListener('resize', this.onOrientationChanged);
  };
};

/***/ }),

/***/ "./extensions/BimWalk/UI/NavigatorSimple.css":
/*!***************************************************!*\
  !*** ./extensions/BimWalk/UI/NavigatorSimple.css ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {


var content = __webpack_require__(/*! !../../../node_modules/css-loader!./NavigatorSimple.css */ "./node_modules/css-loader/index.js!./extensions/BimWalk/UI/NavigatorSimple.css");

if(typeof content === 'string') content = [[module.i, content, '']];

var transform;
var insertInto;



var options = {"hmr":true}

options.transform = transform
options.insertInto = undefined;

var update = __webpack_require__(/*! ../../../node_modules/style-loader/lib/addStyles.js */ "./node_modules/style-loader/lib/addStyles.js")(content, options);

if(content.locals) module.exports = content.locals;

if(false) {}

/***/ }),

/***/ "./extensions/BimWalk/UI/NavigatorSimple.js":
/*!**************************************************!*\
  !*** ./extensions/BimWalk/UI/NavigatorSimple.js ***!
  \**************************************************/
/*! exports provided: NavigatorSimple */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NavigatorSimple", function() { return NavigatorSimple; });
/* harmony import */ var _NavigatorSimpleGuide__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./NavigatorSimpleGuide */ "./extensions/BimWalk/UI/NavigatorSimpleGuide.js");
/* harmony import */ var _NavigatorSimple_css__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./NavigatorSimple.css */ "./extensions/BimWalk/UI/NavigatorSimple.css");
/* harmony import */ var _NavigatorSimple_css__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_NavigatorSimple_css__WEBPACK_IMPORTED_MODULE_1__);



var AutodeskViewing = Autodesk.Viewing;

function NavigatorSimple(navigator) {
  this.viewer = navigator.viewer;
  this.tool = navigator.tool;
  this.opened = false;
  this.hideTimeoutID;
  this.dontRemindAgain_Message = false;
  this.tooltip = new _NavigatorSimpleGuide__WEBPACK_IMPORTED_MODULE_0__["NavigatorSimpleGuide"](this);
  var translate = Autodesk.Viewing.i18n.translate;

  var html =
  '<div class="bimwalk">' +
  '<div id = "tooltip-info" class= "tooltip-info">' +
  '<div id = "info-icon" class = "info-icon">' +
  '</div>' +
  '</div>' +
  '<div id = "speed" class= "message-panel docking-panel docking-panel-container-solid-color-b speed">' +
  '<table>' +
  '<tbody>' +
  '<tr>' +
  '<td class="name" data-i18n="Walk Speed">' + translate('Walk Speed') + '</td>' +
  '<td class="value"></td>' +
  '</tr>' +
  '</tbody>' +
  '</table>' +
  '</div>' +
  '</div>';

  var div = document.createElement('div');
  div.innerHTML = html;

  this.div = div.childNodes[0];
  this.infoIcon = this.div.childNodes[0];
  this.onSpeedChange = this.onSpeedChange.bind(this);
}

var proto = NavigatorSimple.prototype;

//Info guide and speedUI gets activated
proto.activate = function () {

  this.viewer.container.appendChild(this.div);
  this.viewer.addEventListener(AutodeskViewing.EVENT_BIMWALK_CONFIG_CHANGED, this.onSpeedChange);

  //Hide viewCube, home, and info button
  this.viewer.displayViewCube(false);
  this.viewer.displayHomeButton && this.viewer.displayHomeButton(false);

  if (!AutodeskViewing.isMobileDevice()) {
    var infoButton = this.div.querySelector('#tooltip-info');
    infoButton.classList.add('open');

    var self = this;
    infoButton.addEventListener('click', function () {
      self.tooltip.showToolTipUI(true);
    });
  }

  //Check if don't show remind message is set or not
  if (this.viewer.getBimWalkToolPopup()) {
    this.tooltip.showToolTipUI(false);
  }
};

//Info guide and speedUI gets deactivated
proto.deactivate = function () {
  this.viewer.removeEventListener(AutodeskViewing.EVENT_BIMWALK_CONFIG_CHANGED, this.onSpeedChange);
  this.speedHide();

  var target = this.div.querySelector('#speed');
  target.classList.remove('open');

  if (!AutodeskViewing.isMobileDevice()) {
    //Hide Navigation information
    var target1 = this.div.querySelector('#tooltip-info');
    target1.classList.remove('open');

    this.tooltip.hideToolTipUI();
  }

  //show viewCube, home, and info button
  this.viewer.displayViewCube(true);
  this.viewer.displayHomeButton && this.viewer.displayHomeButton(true);
};

proto.isDialogOpen = function () {
  return this.tooltip.opened;
};

proto.onKeyDown = function () {
  if (this.tooltip.opened) {
    this.tooltip.hideToolTipUI();
    return true;
  }
  return false;
};

proto.onSpeedChange = function (event) {
  if (event.data.configuration !== 'topWalkSpeed') {
    return;
  }

  var self = this;

  var speedPanel = this.div.querySelector('#speed');
  speedPanel.classList.add('open');

  var speedValue = this.div.querySelector('.value');
  speedValue.textContent = event.data.value;

  this.hideTimeoutID = setTimeout(function () {
    self.speedHide();
  }, 5000);
  self.opened = true;
};

proto.speedHide = function () {
  var self = this;
  if (self.opened) {
    var target = this.div.querySelector('#speed');
    target.classList.remove('open');

    self.opened = false;
    clearTimeout(this.hideTimeoutID);
  }
};

/***/ }),

/***/ "./extensions/BimWalk/UI/NavigatorSimpleGuide.js":
/*!*******************************************************!*\
  !*** ./extensions/BimWalk/UI/NavigatorSimpleGuide.js ***!
  \*******************************************************/
/*! exports provided: NavigatorSimpleGuide */
/***/ (function(module, __webpack_exports__, __webpack_require__) {

"use strict";
__webpack_require__.r(__webpack_exports__);
/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NavigatorSimpleGuide", function() { return NavigatorSimpleGuide; });
/* harmony import */ var _guide_html__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./guide.html */ "./extensions/BimWalk/UI/guide.html");
/* harmony import */ var _guide_html__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_guide_html__WEBPACK_IMPORTED_MODULE_0__);


var avp = Autodesk.Viewing.Private;

function NavigatorSimpleGuide(navigator) {
  this.viewer = navigator.viewer;
  this.tool = navigator.tool;
  this.onTemplate = this.onTemplate.bind(this);
  this.div = document.createElement('div'); // Div that holds all content
  this.opened = false;

  this.onTemplate(null, _guide_html__WEBPACK_IMPORTED_MODULE_0___default.a);
}

var proto = NavigatorSimpleGuide.prototype;

proto.showToolTipUI = function (openedByUser) {
  this.viewer.container.appendChild(this.div);

  // Avoid showing panel when preference prevents us.
  var dontRemind = this.div.querySelector('#dontRemind');
  dontRemind.style.display = openedByUser ? "none" : "";

  var tooltipPanel = this.div.querySelector('#tooltipPanel');
  tooltipPanel.classList.add('c-bimwalk-tooltip--open');

  this.opened = true;
};

proto.hideToolTipUI = function () {
  var tooltipPanel = this.div.querySelector('#tooltipPanel');
  tooltipPanel.classList.remove('c-bimwalk-tooltip--open');

  this.opened = false;
};

proto.onTemplate = function (err, content) {
  if (err) {
    avp.logger.error('Failed to show BimWalk guide.');
    return;
  }

  var tmp = document.createElement('div');
  tmp.innerHTML = content;
  this.div.appendChild(tmp.childNodes[0]); // Assumes template has only 1 root node.

  var tooltipOK = this.div.querySelector('#tooltipOk');
  tooltipOK.addEventListener('click', this.hideToolTipUI.bind(this));

  var dontRemind = this.div.querySelector('#dontRemind');
  dontRemind.addEventListener('click', function () {
    this.viewer.setBimWalkToolPopup(false);
    this.hideToolTipUI.bind(this);
  }.bind(this));

  this.div.addEventListener('click', function () {
    this.hideToolTipUI();
  }.bind(this));

  // Localize only strings from the newly added DOM
  Autodesk.Viewing.i18n.localize(this.div);
};

/***/ }),

/***/ "./extensions/BimWalk/UI/guide.html":
/*!******************************************!*\
  !*** ./extensions/BimWalk/UI/guide.html ***!
  \******************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = "<div class=\"bimwalk\">\n    <div id=\"tooltipPanel\" class=\"c-bimwalk-tooltip\">\n        <div id=\"tooltipContainer\" class=\"c-bimwalk-tooltip__content\">\n            <span class=\"c-bimwalk-tooltip__title\" data-i18n=\"Navigate in First Person\">Navigate in First Person</span>\n\n            <div id=\"dark-theme\" class=\"bimwalk-guide-dark-theme\">\n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div class=\"docking-panel-close c-bimwalk-tooltip__close\"></div>\n\n                    <div id=\"tooltipMove\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--walk docking-panel-container-solid-color-c\">\n                        <span id=\"moveTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Walk\">Walk</span>\n\n                        <span id=\"tooltipOR\" class=\"bimwalk-tooltip-or\" data-i18n=\"OR\">OR</span>\n\n                        <svg width=\"124px\" height=\"81px\" viewBox=\"0 0 124 81\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-arrows\">\n                                    <rect id=\"Rectangle-3\" fill=\"#FFFFFF\" x=\"44\" y=\"0\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-3\" fill=\"#FFFFFF\" x=\"44\" y=\"45\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-5\" fill=\"#FFFFFF\" x=\"88\" y=\"45\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"45\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"Triangle\" fill=\"#4E4E4E\" points=\"62.0951782 6 67.1903564 14.7272727 57 14.7272727\"></polygon>\n                                    <polygon id=\"Triangle-Copy\" fill=\"#4E4E4E\" transform=\"translate(62.095178, 69.363636) scale(1, -1) translate(-62.095178, -69.363636) \" points=\"62.0951782 65 67.1903564 73.7272727 57 73.7272727\"></polygon>\n                                    <polygon id=\"Triangle-Copy-2\" fill=\"#4E4E4E\" transform=\"translate(106.095178, 63.363636) scale(1, -1) rotate(90.000000) translate(-106.095178, -63.363636) \" points=\"106.095178 59 111.190356 67.7272727 101 67.7272727\"></polygon>\n                                    <polygon id=\"Triangle-Copy-2\" fill=\"#4E4E4E\" transform=\"translate(18.095178, 63.363636) scale(-1, -1) rotate(90.000000) translate(-18.095178, -63.363636) \" points=\"18.0951782 59 23.1903564 67.7272727 13 67.7272727\"></polygon>\n                                </g>\n                            </g>\n                        </svg>\n\n                        <svg width=\"124px\" height=\"80px\" viewBox=\"0 0 124 80\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-wasd\">\n                                    <rect id=\"Rectangle-3\" fill=\"#FFFFFF\" x=\"44\" y=\"0\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-3\" fill=\"#FFFFFF\" x=\"44\" y=\"44\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-5\" fill=\"#FFFFFF\" x=\"88\" y=\"44\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"44\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"W\" fill=\"#4E4E4E\" points=\"58.2353516 13 59.5683594 18.7695312 59.8554688 20.3759766 60.1494141 18.8037109 61.2841797 13 63.5058594 13 64.7021484 18.7695312 65.0097656 20.3759766 65.3173828 18.8310547 66.6640625 13 68.8037109 13 65.9667969 23.0761719 63.9570312 23.0761719 62.7402344 17.1835938 62.3847656 15.2353516 62.0292969 17.1835938 60.8125 23.0761719 58.8574219 23.0761719 56 13\"></polygon>\n                                    <path d=\"M60.0097656,65.2597656 C60.073568,65.7200544 60.1988923,66.0641265 60.3857422,66.2919922 C60.7275408,66.7067078 61.3131469,66.9140625 62.1425781,66.9140625 C62.6393254,66.9140625 63.0426417,66.8593755 63.3525391,66.75 C63.9404326,66.5403635 64.234375,66.150719 64.234375,65.5810547 C64.234375,65.2483707 64.0885431,64.9908863 63.796875,64.8085938 C63.5052069,64.6308585 63.0472036,64.4736335 62.4228516,64.3369141 L61.3564453,64.0976562 C60.308263,63.8606759 59.5836609,63.6031915 59.1826172,63.3251953 C58.5035773,62.8603492 58.1640625,62.1334685 58.1640625,61.1445312 C58.1640625,60.242183 58.4921842,59.492516 59.1484375,58.8955078 C59.8046908,58.2984996 60.7685483,58 62.0400391,58 C63.1018933,58 64.007646,58.2814099 64.7573242,58.8442383 C65.5070024,59.4070666 65.9000649,60.223953 65.9365234,61.2949219 L63.9130859,61.2949219 C63.8766274,60.6887991 63.6123071,60.2581393 63.1201172,60.0029297 C62.7919905,59.8343091 62.384117,59.75 61.8964844,59.75 C61.354164,59.75 60.9212256,59.8593739 60.5976562,60.078125 C60.2740869,60.2968761 60.1123047,60.6022116 60.1123047,60.9941406 C60.1123047,61.3541685 60.2718083,61.623046 60.5908203,61.8007812 C60.7958995,61.9192714 61.2333951,62.0582674 61.9033203,62.2177734 L63.6396484,62.6347656 C64.40072,62.8170582 64.974933,63.0608709 65.3623047,63.3662109 C65.9638702,63.8401716 66.2646484,64.5260372 66.2646484,65.4238281 C66.2646484,66.3444056 65.9126012,67.1088837 65.2084961,67.7172852 C64.504391,68.3256866 63.5097721,68.6298828 62.2246094,68.6298828 C60.9121028,68.6298828 59.8798866,68.3302439 59.1279297,67.730957 C58.3759728,67.1316702 58,66.3079479 58,65.2597656 L60.0097656,65.2597656 Z\" id=\"S\" fill=\"#4E4E4E\"></path>\n                                    <path d=\"M104.043945,59.75 L104.043945,66.3261719 L105.985352,66.3261719 C106.978846,66.3261719 107.671548,65.8362679 108.063477,64.8564453 C108.27767,64.3186822 108.384766,63.6783891 108.384766,62.9355469 C108.384766,61.9101511 108.224123,61.1228869 107.902832,60.5737305 C107.581541,60.0245741 106.942388,59.75 105.985352,59.75 L104.043945,59.75 Z M107.899414,58.21875 C108.605798,58.451173 109.177732,58.8772755 109.615234,59.4970703 C109.966148,59.9983749 110.205403,60.5406872 110.333008,61.1240234 C110.460613,61.7073597 110.524414,62.2633437 110.524414,62.7919922 C110.524414,64.1318426 110.255537,65.2665969 109.717773,66.1962891 C108.988603,67.4495505 107.862963,68.0761719 106.34082,68.0761719 L102,68.0761719 L102,58 L106.34082,58 C106.965172,58.0091146 107.484698,58.0820306 107.899414,58.21875 Z\" id=\"D\" fill=\"#4E4E4E\"></path>\n                                    <path d=\"M16.4658203,64.2685547 L19.0224609,64.2685547 L17.7646484,60.3037109 L16.4658203,64.2685547 Z M16.5957031,58 L18.9746094,58 L22.5429688,68.0761719 L20.2597656,68.0761719 L19.6103516,66.0048828 L15.8984375,66.0048828 L15.2011719,68.0761719 L13,68.0761719 L16.5957031,58 Z\" id=\"A\" fill=\"#4E4E4E\"></path>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n                </div>\n                \n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div id=\"tooltipUpDown\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--updown docking-panel-container-solid-color-c\" >\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Go Up and Down\">Go Up and Down</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Release key to land on the nearest floor\">Release key to land on the nearest floor.</span>\n\n                        <svg width=\"123px\" height=\"37px\" viewBox=\"0 0 123 37\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"First-Person\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"1st-Person-Guides---Desktop-1\" transform=\"translate(-297.000000, -339.000000)\">\n                                    <g id=\"Group-5\" transform=\"translate(297.000000, 339.000000)\">\n                                        <g id=\"Group-7-Copy\" transform=\"translate(22.000000, 0.321429)\">\n                                            <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"35.7428571\" rx=\"4\"></rect>\n                                            <path d=\"M18.5097656,21.7910156 C18.6328131,21.7591144 18.7900381,21.7021488 18.9814453,21.6201172 L17.9628906,20.6494141 L19.0498047,19.5146484 L20.0683594,20.4853516 C20.2278654,20.1572249 20.3395179,19.8701184 20.4033203,19.6240234 C20.5035812,19.254881 20.5537109,18.8242212 20.5537109,18.3320312 C20.5537109,17.2018173 20.3224307,16.3279653 19.8598633,15.7104492 C19.3972959,15.0929331 18.7216841,14.7841797 17.8330078,14.7841797 C16.9990193,14.7841797 16.3336613,15.0804007 15.8369141,15.6728516 C15.3401668,16.2653024 15.0917969,17.1516868 15.0917969,18.3320312 C15.0917969,19.7128975 15.4472621,20.7018199 16.1582031,21.2988281 C16.6184919,21.6861999 17.1699187,21.8798828 17.8125,21.8798828 C18.0540377,21.8798828 18.2864572,21.8502607 18.5097656,21.7910156 Z M22.3310547,20.4375 C22.1533194,21.0162789 21.8912778,21.4970684 21.5449219,21.8798828 L22.7070312,22.9667969 L21.6064453,24.1152344 L20.3896484,22.9667969 C20.020506,23.1901053 19.7014987,23.3473303 19.4326172,23.4384766 C18.9814431,23.5888679 18.4414094,23.6640625 17.8125,23.6640625 C16.4999934,23.6640625 15.4153689,23.2721393 14.5585938,22.4882812 C13.5195261,21.5449172 13,20.1595143 13,18.3320312 C13,16.4908762 13.5331978,15.0986375 14.5996094,14.1552734 C15.4700564,13.3850873 16.5524024,13 17.8466797,13 C19.1500716,13 20.2438107,13.4078735 21.1279297,14.2236328 C22.1487681,15.1669969 22.6591797,16.4863196 22.6591797,18.1816406 C22.6591797,19.0794316 22.5498058,19.8313772 22.3310547,20.4375 Z\" id=\"Q\" fill=\"#4E4E4E\"></path>\n                                        </g>\n                                        <g id=\"Group-7-Copy-2\" transform=\"translate(65.000000, 0.321429)\">\n                                            <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"35.7428571\" rx=\"4\"></rect>\n                                            <polygon id=\"E\" fill=\"#4E4E4E\" points=\"21.3896484 14.7841797 16.0576172 14.7841797 16.0576172 16.9238281 20.9521484 16.9238281 20.9521484 18.6738281 16.0576172 18.6738281 16.0576172 21.2646484 21.6357422 21.2646484 21.6357422 23.0761719 14 23.0761719 14 13 21.3896484 13\"></polygon>\n                                        </g>\n                                        <g id=\"Group-4\" opacity=\"0.6\" transform=\"translate(5.000000, 18.192857) scale(1, -1) translate(-5.000000, -18.192857) translate(0.000000, 7.271429)\" fill=\"#FFFFFF\">\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 8.439286) rotate(90.000000) translate(-5.000000, -8.439286) \" x=\"0.5\" y=\"6.45357143\" width=\"9\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 16.382143) rotate(90.000000) translate(-5.000000, -16.382143) \" x=\"3.5\" y=\"14.3964286\" width=\"3\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 20.850000) rotate(90.000000) translate(-5.000000, -20.850000) \" x=\"4\" y=\"18.8642857\" width=\"2\" height=\"3.97142857\"></rect>\n                                            <polygon id=\"_Path_2\" transform=\"translate(5.000000, 2.482143) rotate(-90.000000) translate(-5.000000, -2.482143) \" points=\"2.5 7.44642857 2.5 -2.48214286 7.5 2.48214286\"></polygon>\n                                        </g>\n                                        <g id=\"Group-4-Copy\" opacity=\"0.6\" transform=\"translate(118.000000, 18.192857) scale(1, -1) rotate(-180.000000) translate(-118.000000, -18.192857) translate(113.000000, 7.271429)\" fill=\"#FFFFFF\">\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 8.439286) rotate(90.000000) translate(-5.000000, -8.439286) \" x=\"0.5\" y=\"6.45357143\" width=\"9\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 16.382143) rotate(90.000000) translate(-5.000000, -16.382143) \" x=\"3.5\" y=\"14.3964286\" width=\"3\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 20.850000) rotate(90.000000) translate(-5.000000, -20.850000) \" x=\"4\" y=\"18.8642857\" width=\"2\" height=\"3.97142857\"></rect>\n                                            <polygon id=\"_Path_2\" transform=\"translate(5.000000, 2.482143) rotate(-90.000000) translate(-5.000000, -2.482143) \" points=\"2.5 7.44642857 2.5 -2.48214286 7.5 2.48214286\"></polygon>\n                                        </g>\n                                    </g>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipRun\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--run docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Run\">Run</span>\n\n                        <svg width=\"72px\" height=\"36px\" viewBox=\"0 0 72 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"c-bimwalk-tooltip__shift\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-shift\">\n                                    <rect id=\"Rectangle-3-Copy-10\" fill=\"#FFFFFF\" x=\"0\" y=\"0\" width=\"72\" height=\"36\" rx=\"4\"></rect>\n                                    <path d=\"M11.4267578,24.6210938 C11.4677736,24.9674496 11.5566399,25.2135409 11.6933594,25.359375 C11.934897,25.6191419 12.3815072,25.7490234 13.0332031,25.7490234 C13.4160175,25.7490234 13.7202137,25.6920579 13.9458008,25.578125 C14.1713878,25.4641921 14.2841797,25.2932954 14.2841797,25.0654297 C14.2841797,24.8466786 14.1930348,24.6803391 14.0107422,24.5664062 C13.8284496,24.4524734 13.1516986,24.2565118 11.9804688,23.9785156 C11.1373656,23.7688792 10.542645,23.5068375 10.1962891,23.1923828 C9.84993316,22.8824854 9.67675781,22.4358753 9.67675781,21.8525391 C9.67675781,21.1643846 9.94677464,20.5730819 10.4868164,20.0786133 C11.0268582,19.5841447 11.786779,19.3369141 12.7666016,19.3369141 C13.6962937,19.3369141 14.4539359,19.5226218 15.0395508,19.894043 C15.6251657,20.2654641 15.9612626,20.9068965 16.0478516,21.8183594 L14.0996094,21.8183594 C14.0722655,21.5677071 14.0016282,21.3694669 13.8876953,21.2236328 C13.6735015,20.9593086 13.3089218,20.8271484 12.7939453,20.8271484 C12.3701151,20.8271484 12.0681975,20.8932285 11.8881836,21.0253906 C11.7081697,21.1575527 11.6181641,21.3124991 11.6181641,21.4902344 C11.6181641,21.7135428 11.7138662,21.875325 11.9052734,21.9755859 C12.0966806,22.0804042 12.7734317,22.2604154 13.9355469,22.515625 C14.7102903,22.6979176 15.2913392,22.973631 15.6787109,23.3427734 C16.0615254,23.7164732 16.2529297,24.1835909 16.2529297,24.7441406 C16.2529297,25.4824256 15.9783556,26.0851214 15.4291992,26.5522461 C14.8800428,27.0193708 14.0312557,27.2529297 12.8828125,27.2529297 C11.7115827,27.2529297 10.8468452,27.0056991 10.2885742,26.5112305 C9.7303032,26.0167619 9.45117188,25.3867226 9.45117188,24.6210938 L11.4267578,24.6210938 Z M23.0581055,19.5966797 C23.4340839,19.7561857 23.7428373,19.9999984 23.984375,20.328125 C24.1894542,20.6061212 24.3147784,20.8920884 24.3603516,21.1860352 C24.4059247,21.4799819 24.4287109,21.9596321 24.4287109,22.625 L24.4287109,27 L22.4394531,27 L22.4394531,22.4677734 C22.4394531,22.0667298 22.3710944,21.7431653 22.234375,21.4970703 C22.0566397,21.1507144 21.7194035,20.9775391 21.2226562,20.9775391 C20.7076797,20.9775391 20.3168959,21.1495751 20.050293,21.4936523 C19.7836901,21.8377296 19.6503906,22.3287729 19.6503906,22.9667969 L19.6503906,27 L17.7089844,27 L17.7089844,16.9580078 L19.6503906,16.9580078 L19.6503906,20.5195312 C19.9329441,20.0865864 20.2599265,19.7846688 20.6313477,19.6137695 C21.0027688,19.4428702 21.3935526,19.3574219 21.8037109,19.3574219 C22.2639997,19.3574219 22.682127,19.4371737 23.0581055,19.5966797 Z M28.25,18.6601562 L26.2744141,18.6601562 L26.2744141,16.8623047 L28.25,16.8623047 L28.25,18.6601562 Z M26.2744141,19.5488281 L28.25,19.5488281 L28.25,27 L26.2744141,27 L26.2744141,19.5488281 Z M33.2197266,16.831543 C33.3199875,16.8383789 33.4567049,16.8486327 33.6298828,16.8623047 L33.6298828,18.4482422 C33.5205073,18.4345702 33.3370781,18.4243164 33.0795898,18.4174805 C32.8221016,18.4106445 32.644369,18.4676101 32.5463867,18.5883789 C32.4484045,18.7091477 32.3994141,18.8424472 32.3994141,18.9882812 L32.3994141,19.6171875 L33.6777344,19.6171875 L33.6777344,20.9912109 L32.3994141,20.9912109 L32.3994141,27 L30.4580078,27 L30.4580078,20.9912109 L29.3710938,20.9912109 L29.3710938,19.6171875 L30.4375,19.6171875 L30.4375,19.1386719 C30.4375,18.3411418 30.5719388,17.7919937 30.8408203,17.4912109 C31.1233738,17.0445941 31.8046821,16.8212891 32.8847656,16.8212891 C33.0078131,16.8212891 33.1194656,16.824707 33.2197266,16.831543 Z M34.0332031,21.0048828 L34.0332031,19.6171875 L35.0722656,19.6171875 L35.0722656,17.5390625 L37,17.5390625 L37,19.6171875 L38.2099609,19.6171875 L38.2099609,21.0048828 L37,21.0048828 L37,24.9423828 C37,25.2477229 37.0387366,25.4379879 37.1162109,25.5131836 C37.1936853,25.5883793 37.4306621,25.6259766 37.8271484,25.6259766 C37.8863935,25.6259766 37.9490557,25.6248373 38.0151367,25.6225586 C38.0812178,25.6202799 38.1461585,25.616862 38.2099609,25.6123047 L38.2099609,27.0683594 L37.2871094,27.1025391 C36.3665319,27.1344403 35.7376319,26.9749367 35.4003906,26.6240234 C35.1816395,26.400715 35.0722656,26.0566429 35.0722656,25.5917969 L35.0722656,21.0048828 L34.0332031,21.0048828 Z\" id=\"shift\" fill=\"#4E4E4E\"></path>\n                                </g>\n                            </g>\n                        </svg>\n\n                        <svg width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"c-bimwalk-tooltip__plus\">\n                            <path d=\"m 12,12 -10,0 0,8 10,0 0,10 8,0 0,-10 10,0 0,-8 -10,0 0,-10 -8,0 z\" fill=\"#ffffff\"></path>\n                        </svg>\n\n                        <span id=\"directionKey\" class=\"c-bimwalk-tooltip__direction\" data-i18n=\"Direction Key\">Direction Key</span>\n                    </div>\n                </div>\n\n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div id=\"tooltipTeleport\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--teleport docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Teleport\">Teleport</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Double click on destination\">Double click on destination</span>\n\n                        <svg width=\"46px\" height=\"46px\" viewBox=\"0 0 46 46\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"gesture-double-click\" fill=\"#FFFFFF\">\n                                    <circle id=\"Oval-2\" fill-opacity=\"0.1\" cx=\"17.5\" cy=\"17.5\" r=\"17.5\"></circle>\n                                    <circle id=\"Oval-2\" fill-opacity=\"0.2\" cx=\"17.5\" cy=\"17.5\" r=\"12.5\"></circle>\n                                    <circle id=\"Oval-2\" fill-opacity=\"0.3\" cx=\"17.5\" cy=\"17.5\" r=\"7.5\"></circle>\n                                    <path d=\"M44.9736119,25.4255085 L17.6278175,17.7058824 C17.4969764,17.7058824 17.3661352,17.7058824 17.3007147,17.7713029 C17.2352941,17.8367235 17.2352941,18.0329852 17.2352941,18.0984057 L24.7586586,45.6404618 C24.8240792,45.7713029 24.8894997,45.902144 25.0857614,45.902144 L25.0857614,45.902144 C25.2166025,45.902144 25.3474437,45.8367235 25.4128642,45.7058824 L30.9081913,31.3787795 L45.0390324,26.0797141 C45.1698736,26.0142936 45.2352941,25.8834524 45.2352941,25.7526113 C45.2352941,25.6217702 45.104453,25.4909291 44.9736119,25.4255085 Z\" id=\"Shape\"></path>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipLookAround\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--look docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Look Around\">Look Around</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Drag with left key on view\">Drag with left key on view</span>\n\n                        <svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"66\" height=\"60\" viewBox=\"0 0 66 60\">\n                        <g id=\"_Group_\" data-name=\"&lt;Group&gt;\" opacity=\"0.1\">\n                            <g id=\"_Group_2\" data-name=\"&lt;Group&gt;\">\n                            <rect id=\"_Rectangle_\" data-name=\"&lt;Rectangle&gt;\" x=\"36.9\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" fill=\"#fff\"/>\n                            </g>\n                        </g>\n                        <g id=\"_Group_3\" data-name=\"&lt;Group&gt;\" opacity=\"0.2\">\n                            <g id=\"_Group_4\" data-name=\"&lt;Group&gt;\">\n                            <rect id=\"_Rectangle_2\" data-name=\"&lt;Rectangle&gt;\" x=\"30.8\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" fill=\"#fff\"/>\n                            </g>\n                        </g>\n                        <g id=\"_Group_5\" data-name=\"&lt;Group&gt;\" opacity=\"0.3\">\n                            <g id=\"_Group_6\" data-name=\"&lt;Group&gt;\">\n                            <rect id=\"_Rectangle_3\" data-name=\"&lt;Rectangle&gt;\" x=\"25.1\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" fill=\"#fff\"/>\n                            </g>\n                        </g>\n                        <g id=\"_Group_7\" data-name=\"&lt;Group&gt;\">\n                            <g id=\"_Group_8\" data-name=\"&lt;Group&gt;\" opacity=\"0.1\">\n                            <g id=\"_Group_9\" data-name=\"&lt;Group&gt;\">\n                                <rect id=\"_Rectangle_4\" data-name=\"&lt;Rectangle&gt;\" x=\"0.1\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" transform=\"translate(29.2 74.1) rotate(-180)\" fill=\"#fff\"/>\n                            </g>\n                            </g>\n                            <g id=\"_Group_10\" data-name=\"&lt;Group&gt;\" opacity=\"0.2\">\n                            <g id=\"_Group_11\" data-name=\"&lt;Group&gt;\">\n                                <rect id=\"_Rectangle_5\" data-name=\"&lt;Rectangle&gt;\" x=\"6.2\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" transform=\"translate(41.5 74.1) rotate(180)\" fill=\"#fff\"/>\n                            </g>\n                            </g>\n                            <g id=\"_Group_12\" data-name=\"&lt;Group&gt;\" opacity=\"0.3\">\n                            <g id=\"_Group_13\" data-name=\"&lt;Group&gt;\">\n                                <rect id=\"_Rectangle_6\" data-name=\"&lt;Rectangle&gt;\" x=\"11.9\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" transform=\"translate(52.7 74.1) rotate(-180)\" fill=\"#fff\"/>\n                            </g>\n                            </g>\n                        </g>\n                        <g id=\"_Group_14\" data-name=\"&lt;Group&gt;\">\n                            <g id=\"_Group_15\" data-name=\"&lt;Group&gt;\">\n                            <rect id=\"_Rectangle_7\" data-name=\"&lt;Rectangle&gt;\" x=\"18\" y=\"14\" width=\"29\" height=\"46\" rx=\"14.5\" ry=\"14.5\" fill=\"#fff\"/>\n                            </g>\n                        </g>\n                        <path id=\"_Path_\" data-name=\"&lt;Path&gt;\" d=\"M33.2,30.5v-14h.2c-6.8,0-13.2,5.3-13.2,12.1v1.9h13Z\" fill=\"#4e4e4e\"/>\n                        <rect id=\"_Rectangle_8\" data-name=\"&lt;Rectangle&gt;\" x=\"27.6\" y=\"2\" width=\"9.6\" height=\"4\" transform=\"translate(64.8 8) rotate(180)\" fill=\"#fff\"/>\n                        <polygon id=\"_Path_2\" data-name=\"&lt;Path&gt;\" points=\"36.6 8 36.6 0 40.6 4 36.6 8\" fill=\"#fff\"/>\n                        <g id=\"_Group_16\" data-name=\"&lt;Group&gt;\">\n                            <polygon id=\"_Path_3\" data-name=\"&lt;Path&gt;\" points=\"28.7 0 28.7 8 24.6 4 28.7 0\" fill=\"#fff\"/>\n                        </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipAdjustSpeed\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--speed docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Adjust Speed\">Adjust Speed</span>\n                    \n                        <svg width=\"80px\" height=\"36px\" viewBox=\"0 0 80 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-minus-plus\">\n                                    <rect id=\"Rectangle-3-Copy-8\" fill=\"#FFFFFF\" x=\"44\" y=\"5.68434189e-15\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"+\" fill=\"#4E4E4E\" points=\"58 18.5869141 58 16.8027344 60.8027344 16.8027344 60.8027344 14 62.6005859 14 62.6005859 16.8027344 65.4033203 16.8027344 65.4033203 18.5869141 62.6005859 18.5869141 62.6005859 21.4033203 60.8027344 21.4033203 60.8027344 18.5869141\"></polygon>\n                                    <rect id=\"Rectangle-3-Copy-7\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"–\" fill=\"#4E4E4E\" points=\"14 17 21.8408203 17 21.8408203 18.4902344 14 18.4902344\"></polygon>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n                </div>\n            </div>\n\n            <div id=\"light-theme\" class=\"bimwalk-guide-light-theme\">\n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div class=\"docking-panel-close c-bimwalk-tooltip__close\"></div>\n\n                    <div id=\"tooltipMove\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--walk docking-panel-container-solid-color-c\">\n                        <span id=\"moveTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Walk\">Walk</span>\n\n                        <span id=\"tooltipOR\" class=\"bimwalk-tooltip-or\" data-i18n=\"OR\">OR</span>\n\n                        <svg width=\"124px\" height=\"81px\" viewBox=\"0 0 124 81\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-arrows\">\n                                    <rect id=\"Rectangle-3\" fill=\"#FFFFFF\" x=\"44\" y=\"0\" width=\"36\" height=\"35.1111111\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-3\" fill=\"#FFFFFF\" x=\"44\" y=\"43.8888889\" width=\"36\" height=\"35.1111111\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-5\" fill=\"#FFFFFF\" x=\"88\" y=\"43.8888889\" width=\"36\" height=\"35.1111111\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"43.8888889\" width=\"36\" height=\"35.1111111\" rx=\"4\"></rect>\n                                    <polygon id=\"Triangle\" fill=\"#4E4E4E\" points=\"62.0951782 5.85185185 67.1903564 14.3636364 57 14.3636364\"></polygon>\n                                    <polygon id=\"Triangle-Copy\" fill=\"#4E4E4E\" transform=\"translate(62.095178, 67.650954) scale(1, -1) translate(-62.095178, -67.650954) \" points=\"62.0951782 63.3950617 67.1903564 71.9068462 57 71.9068462\"></polygon>\n                                    <polygon id=\"Triangle-Copy-2\" fill=\"#4E4E4E\" transform=\"translate(106.095178, 61.799102) scale(1, -1) rotate(90.000000) translate(-106.095178, -61.799102) \" points=\"106.095178 57.5432099 111.190356 66.0549944 101 66.0549944\"></polygon>\n                                    <polygon id=\"Triangle-Copy-2\" fill=\"#4E4E4E\" transform=\"translate(18.095178, 61.799102) scale(-1, -1) rotate(90.000000) translate(-18.095178, -61.799102) \" points=\"18.0951782 57.5432099 23.1903564 66.0549944 13 66.0549944\"></polygon>\n                                </g>\n                            </g>\n                        </svg>\n\n                        <svg width=\"124px\" height=\"80px\" viewBox=\"0 0 124 80\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-wasd\">\n                                    <rect id=\"Rectangle-3\" fill=\"#FFFFFF\" x=\"44\" y=\"0\" width=\"36\" height=\"35.55\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-3\" fill=\"#FFFFFF\" x=\"44\" y=\"43.45\" width=\"36\" height=\"35.55\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-5\" fill=\"#FFFFFF\" x=\"88\" y=\"43.45\" width=\"36\" height=\"35.55\" rx=\"4\"></rect>\n                                    <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"43.45\" width=\"36\" height=\"35.55\" rx=\"4\"></rect>\n                                    <polygon id=\"W\" fill=\"#4E4E4E\" points=\"58.2353516 12.8375 59.5683594 18.5349121 59.8554688 20.1212769 60.1494141 18.5686646 61.2841797 12.8375 63.5058594 12.8375 64.7021484 18.5349121 65.0097656 20.1212769 65.3173828 18.5956665 66.6640625 12.8375 68.8037109 12.8375 65.9667969 22.7877197 63.9570312 22.7877197 62.7402344 16.9687988 62.3847656 15.0449097 62.0292969 16.9687988 60.8125 22.7877197 58.8574219 22.7877197 56 12.8375\"></polygon>\n                                    <path d=\"M60.0097656,63.4565186 C60.073568,63.9110537 60.1988923,64.2508249 60.3857422,64.4758423 C60.7275408,64.885374 61.3131469,65.0901367 62.1425781,65.0901367 C62.6393254,65.0901367 63.0426417,65.0361334 63.3525391,64.928125 C63.9404326,64.721109 64.234375,64.336335 64.234375,63.7737915 C64.234375,63.4452661 64.0885431,63.1910002 63.796875,63.0109863 C63.5052069,62.8354728 63.0472036,62.6802131 62.4228516,62.5452026 L61.3564453,62.3089355 C60.308263,62.0749174 59.5836609,61.8206516 59.1826172,61.5461304 C58.5035773,61.0870949 58.1640625,60.3693001 58.1640625,59.3927246 C58.1640625,58.5016557 58.4921842,57.7613596 59.1484375,57.171814 C59.8046908,56.5822684 60.7685483,56.2875 62.0400391,56.2875 C63.1018933,56.2875 64.007646,56.5653923 64.7573242,57.1211853 C65.5070024,57.6769783 65.9000649,58.4836536 65.9365234,59.5412354 L63.9130859,59.5412354 C63.8766274,58.9426891 63.6123071,58.5174126 63.1201172,58.2653931 C62.7919905,58.0988802 62.384117,58.015625 61.8964844,58.015625 C61.354164,58.015625 60.9212256,58.1236317 60.5976562,58.3396484 C60.2740869,58.5556651 60.1123047,58.8571839 60.1123047,59.2442139 C60.1123047,59.5997414 60.2718083,59.8652579 60.5908203,60.0407715 C60.7958995,60.1577805 61.2333951,60.2950391 61.9033203,60.4525513 L63.6396484,60.8643311 C64.40072,61.044345 64.974933,61.28511 65.3623047,61.5866333 C65.9638702,62.0546695 66.2646484,62.7319617 66.2646484,63.6185303 C66.2646484,64.5276006 65.9126012,65.2825226 65.2084961,65.8833191 C64.504391,66.4841156 63.5097721,66.7845093 62.2246094,66.7845093 C60.9121028,66.7845093 59.8798866,66.4886158 59.1279297,65.8968201 C58.3759728,65.3050243 58,64.4915986 58,63.4565186 L60.0097656,63.4565186 Z\" id=\"S\" fill=\"#4E4E4E\"></path>\n                                    <path d=\"M104.043945,58.015625 L104.043945,64.5095947 L105.985352,64.5095947 C106.978846,64.5095947 107.671548,64.0258146 108.063477,63.0582397 C108.27767,62.5271987 108.384766,61.8949093 108.384766,61.1613525 C108.384766,60.1487742 108.224123,59.3713508 107.902832,58.8290588 C107.581541,58.2867669 106.942388,58.015625 105.985352,58.015625 L104.043945,58.015625 Z M107.899414,56.5035156 C108.605798,56.7330334 109.177732,57.1538096 109.615234,57.7658569 C109.966148,58.2608952 110.205403,58.7964286 110.333008,59.3724731 C110.460613,59.9485177 110.524414,60.4975519 110.524414,61.0195923 C110.524414,62.3426946 110.255537,63.4632645 109.717773,64.3813354 C108.988603,65.6189312 107.862963,66.2377197 106.34082,66.2377197 L102,66.2377197 L102,56.2875 L106.34082,56.2875 C106.965172,56.2965007 107.484698,56.3685052 107.899414,56.5035156 Z\" id=\"D\" fill=\"#4E4E4E\"></path>\n                                    <path d=\"M16.4658203,62.4776978 L19.0224609,62.4776978 L17.7646484,58.5624146 L16.4658203,62.4776978 Z M16.5957031,56.2875 L18.9746094,56.2875 L22.5429688,66.2377197 L20.2597656,66.2377197 L19.6103516,64.1923218 L15.8984375,64.1923218 L15.2011719,66.2377197 L13,66.2377197 L16.5957031,56.2875 Z\" id=\"A\" fill=\"#4E4E4E\"></path>       </g>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n                </div>\n                \n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div id=\"tooltipUpDown\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--updown docking-panel-container-solid-color-c\" >\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Go Up and Down\">Go Up and Down</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Release key to land on the nearest floor\">Release key to land on the nearest floor.</span>\n\n                        <svg width=\"123px\" height=\"37px\" viewBox=\"0 0 123 37\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"First-Person\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"1st-Person-Guides---Desktop-1\" transform=\"translate(-297.000000, -339.000000)\">\n                                    <g id=\"Group-5\" transform=\"translate(297.000000, 339.000000)\">\n                                        <g id=\"Group-7-Copy\" transform=\"translate(22.000000, 0.321429)\">\n                                            <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"35.7428571\" rx=\"4\"></rect>\n                                            <path d=\"M18.5097656,21.7910156 C18.6328131,21.7591144 18.7900381,21.7021488 18.9814453,21.6201172 L17.9628906,20.6494141 L19.0498047,19.5146484 L20.0683594,20.4853516 C20.2278654,20.1572249 20.3395179,19.8701184 20.4033203,19.6240234 C20.5035812,19.254881 20.5537109,18.8242212 20.5537109,18.3320312 C20.5537109,17.2018173 20.3224307,16.3279653 19.8598633,15.7104492 C19.3972959,15.0929331 18.7216841,14.7841797 17.8330078,14.7841797 C16.9990193,14.7841797 16.3336613,15.0804007 15.8369141,15.6728516 C15.3401668,16.2653024 15.0917969,17.1516868 15.0917969,18.3320312 C15.0917969,19.7128975 15.4472621,20.7018199 16.1582031,21.2988281 C16.6184919,21.6861999 17.1699187,21.8798828 17.8125,21.8798828 C18.0540377,21.8798828 18.2864572,21.8502607 18.5097656,21.7910156 Z M22.3310547,20.4375 C22.1533194,21.0162789 21.8912778,21.4970684 21.5449219,21.8798828 L22.7070312,22.9667969 L21.6064453,24.1152344 L20.3896484,22.9667969 C20.020506,23.1901053 19.7014987,23.3473303 19.4326172,23.4384766 C18.9814431,23.5888679 18.4414094,23.6640625 17.8125,23.6640625 C16.4999934,23.6640625 15.4153689,23.2721393 14.5585938,22.4882812 C13.5195261,21.5449172 13,20.1595143 13,18.3320312 C13,16.4908762 13.5331978,15.0986375 14.5996094,14.1552734 C15.4700564,13.3850873 16.5524024,13 17.8466797,13 C19.1500716,13 20.2438107,13.4078735 21.1279297,14.2236328 C22.1487681,15.1669969 22.6591797,16.4863196 22.6591797,18.1816406 C22.6591797,19.0794316 22.5498058,19.8313772 22.3310547,20.4375 Z\" id=\"Q\" fill=\"#4E4E4E\"></path>\n                                        </g>\n                                        <g id=\"Group-7-Copy-2\" transform=\"translate(65.000000, 0.321429)\">\n                                            <rect id=\"Rectangle-3-Copy-4\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"35.7428571\" rx=\"4\"></rect>\n                                            <polygon id=\"E\" fill=\"#4E4E4E\" points=\"21.3896484 14.7841797 16.0576172 14.7841797 16.0576172 16.9238281 20.9521484 16.9238281 20.9521484 18.6738281 16.0576172 18.6738281 16.0576172 21.2646484 21.6357422 21.2646484 21.6357422 23.0761719 14 23.0761719 14 13 21.3896484 13\"></polygon>\n                                        </g>\n                                        <g id=\"Group-4\" opacity=\"0.6\" transform=\"translate(5.000000, 18.614286) scale(1, -1) translate(-5.000000, -18.614286) translate(0.000000, 7.114286)\" fill=\"#939CA5\">\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 9.439286) rotate(90.000000) translate(-5.000000, -9.439286) \" x=\"0.5\" y=\"7.45357143\" width=\"9\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 17.382143) rotate(90.000000) translate(-5.000000, -17.382143) \" x=\"3.5\" y=\"15.3964286\" width=\"3\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 21.850000) rotate(90.000000) translate(-5.000000, -21.850000) \" x=\"4\" y=\"19.8642857\" width=\"2\" height=\"3.97142857\"></rect>\n                                            <polygon id=\"_Path_2\" transform=\"translate(5.000000, 3.482143) rotate(-90.000000) translate(-5.000000, -3.482143) \" points=\"2.5 8.44642857 2.5 -1.48214286 7.5 3.48214286\"></polygon>\n                                        </g>\n                                        <g id=\"Group-4-Copy\" opacity=\"0.6\" transform=\"translate(118.000000, 17.771429) scale(1, -1) rotate(-180.000000) translate(-118.000000, -17.771429) translate(113.000000, 6.271429)\" fill=\"#939CA5\">\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 9.439286) rotate(90.000000) translate(-5.000000, -9.439286) \" x=\"0.5\" y=\"7.45357143\" width=\"9\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 17.382143) rotate(90.000000) translate(-5.000000, -17.382143) \" x=\"3.5\" y=\"15.3964286\" width=\"3\" height=\"3.97142857\"></rect>\n                                            <rect id=\"_Rectangle_8\" transform=\"translate(5.000000, 21.850000) rotate(90.000000) translate(-5.000000, -21.850000) \" x=\"4\" y=\"19.8642857\" width=\"2\" height=\"3.97142857\"></rect>\n                                            <polygon id=\"_Path_2\" transform=\"translate(5.000000, 3.482143) rotate(-90.000000) translate(-5.000000, -3.482143) \" points=\"2.5 8.44642857 2.5 -1.48214286 7.5 3.48214286\"></polygon>\n                                        </g>\n                                    </g>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipRun\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--run docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Run\">Run</span>\n\n                        <svg width=\"72px\" height=\"36px\" viewBox=\"0 0 72 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"c-bimwalk-tooltip__shift\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-shift\">\n                                    <rect id=\"Rectangle-3-Copy-10\" fill=\"#FFFFFF\" x=\"0\" y=\"0\" width=\"72\" height=\"36\" rx=\"4\"></rect>\n                                    <path d=\"M11.4267578,24.6210938 C11.4677736,24.9674496 11.5566399,25.2135409 11.6933594,25.359375 C11.934897,25.6191419 12.3815072,25.7490234 13.0332031,25.7490234 C13.4160175,25.7490234 13.7202137,25.6920579 13.9458008,25.578125 C14.1713878,25.4641921 14.2841797,25.2932954 14.2841797,25.0654297 C14.2841797,24.8466786 14.1930348,24.6803391 14.0107422,24.5664062 C13.8284496,24.4524734 13.1516986,24.2565118 11.9804688,23.9785156 C11.1373656,23.7688792 10.542645,23.5068375 10.1962891,23.1923828 C9.84993316,22.8824854 9.67675781,22.4358753 9.67675781,21.8525391 C9.67675781,21.1643846 9.94677464,20.5730819 10.4868164,20.0786133 C11.0268582,19.5841447 11.786779,19.3369141 12.7666016,19.3369141 C13.6962937,19.3369141 14.4539359,19.5226218 15.0395508,19.894043 C15.6251657,20.2654641 15.9612626,20.9068965 16.0478516,21.8183594 L14.0996094,21.8183594 C14.0722655,21.5677071 14.0016282,21.3694669 13.8876953,21.2236328 C13.6735015,20.9593086 13.3089218,20.8271484 12.7939453,20.8271484 C12.3701151,20.8271484 12.0681975,20.8932285 11.8881836,21.0253906 C11.7081697,21.1575527 11.6181641,21.3124991 11.6181641,21.4902344 C11.6181641,21.7135428 11.7138662,21.875325 11.9052734,21.9755859 C12.0966806,22.0804042 12.7734317,22.2604154 13.9355469,22.515625 C14.7102903,22.6979176 15.2913392,22.973631 15.6787109,23.3427734 C16.0615254,23.7164732 16.2529297,24.1835909 16.2529297,24.7441406 C16.2529297,25.4824256 15.9783556,26.0851214 15.4291992,26.5522461 C14.8800428,27.0193708 14.0312557,27.2529297 12.8828125,27.2529297 C11.7115827,27.2529297 10.8468452,27.0056991 10.2885742,26.5112305 C9.7303032,26.0167619 9.45117188,25.3867226 9.45117188,24.6210938 L11.4267578,24.6210938 Z M23.0581055,19.5966797 C23.4340839,19.7561857 23.7428373,19.9999984 23.984375,20.328125 C24.1894542,20.6061212 24.3147784,20.8920884 24.3603516,21.1860352 C24.4059247,21.4799819 24.4287109,21.9596321 24.4287109,22.625 L24.4287109,27 L22.4394531,27 L22.4394531,22.4677734 C22.4394531,22.0667298 22.3710944,21.7431653 22.234375,21.4970703 C22.0566397,21.1507144 21.7194035,20.9775391 21.2226562,20.9775391 C20.7076797,20.9775391 20.3168959,21.1495751 20.050293,21.4936523 C19.7836901,21.8377296 19.6503906,22.3287729 19.6503906,22.9667969 L19.6503906,27 L17.7089844,27 L17.7089844,16.9580078 L19.6503906,16.9580078 L19.6503906,20.5195312 C19.9329441,20.0865864 20.2599265,19.7846688 20.6313477,19.6137695 C21.0027688,19.4428702 21.3935526,19.3574219 21.8037109,19.3574219 C22.2639997,19.3574219 22.682127,19.4371737 23.0581055,19.5966797 Z M28.25,18.6601562 L26.2744141,18.6601562 L26.2744141,16.8623047 L28.25,16.8623047 L28.25,18.6601562 Z M26.2744141,19.5488281 L28.25,19.5488281 L28.25,27 L26.2744141,27 L26.2744141,19.5488281 Z M33.2197266,16.831543 C33.3199875,16.8383789 33.4567049,16.8486327 33.6298828,16.8623047 L33.6298828,18.4482422 C33.5205073,18.4345702 33.3370781,18.4243164 33.0795898,18.4174805 C32.8221016,18.4106445 32.644369,18.4676101 32.5463867,18.5883789 C32.4484045,18.7091477 32.3994141,18.8424472 32.3994141,18.9882812 L32.3994141,19.6171875 L33.6777344,19.6171875 L33.6777344,20.9912109 L32.3994141,20.9912109 L32.3994141,27 L30.4580078,27 L30.4580078,20.9912109 L29.3710938,20.9912109 L29.3710938,19.6171875 L30.4375,19.6171875 L30.4375,19.1386719 C30.4375,18.3411418 30.5719388,17.7919937 30.8408203,17.4912109 C31.1233738,17.0445941 31.8046821,16.8212891 32.8847656,16.8212891 C33.0078131,16.8212891 33.1194656,16.824707 33.2197266,16.831543 Z M34.0332031,21.0048828 L34.0332031,19.6171875 L35.0722656,19.6171875 L35.0722656,17.5390625 L37,17.5390625 L37,19.6171875 L38.2099609,19.6171875 L38.2099609,21.0048828 L37,21.0048828 L37,24.9423828 C37,25.2477229 37.0387366,25.4379879 37.1162109,25.5131836 C37.1936853,25.5883793 37.4306621,25.6259766 37.8271484,25.6259766 C37.8863935,25.6259766 37.9490557,25.6248373 38.0151367,25.6225586 C38.0812178,25.6202799 38.1461585,25.616862 38.2099609,25.6123047 L38.2099609,27.0683594 L37.2871094,27.1025391 C36.3665319,27.1344403 35.7376319,26.9749367 35.4003906,26.6240234 C35.1816395,26.400715 35.0722656,26.0566429 35.0722656,25.5917969 L35.0722656,21.0048828 L34.0332031,21.0048828 Z\" id=\"shift\" fill=\"#4E4E4E\"></path>\n                                </g>\n                            </g>\n                        </svg>\n\n                        <svg width=\"32px\" height=\"32px\" viewBox=\"0 0 32 32\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" class=\"c-bimwalk-tooltip__plus\">\n                            <path d=\"m 12,12 -10,0 0,8 10,0 0,10 8,0 0,-10 10,0 0,-8 -10,0 0,-10 -8,0 z\" fill=\"#939ca5\"></path>\n                        </svg>\n\n                        <span id=\"directionKey\" class=\"c-bimwalk-tooltip__direction\" data-i18n=\"Direction Key\">Direction Key</span>\n                    </div>\n                </div>\n\n                <div class=\"c-bimwalk-tooltip__row\">\n                    <div id=\"tooltipTeleport\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--teleport docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Teleport\">Teleport</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Double click on destination\">Double click on destination</span>\n\n                        <svg width=\"46px\" height=\"46px\" viewBox=\"0 0 46 46\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <!-- Generator: Sketch 47 (45396) - http://www.bohemiancoding.com/sketch -->\n                            <title>gesture-double-click</title>\n                            <desc>Created with Sketch.</desc>\n                            <defs></defs>\n                            <g id=\"3D-LMV\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"First-Person---Guides---Desktop---light\" transform=\"translate(-284.000000, -469.000000)\">\n                                    <g id=\"gesture-double-click\" transform=\"translate(284.000000, 469.385714)\">\n                                        <ellipse id=\"Oval-2\" fill=\"#D4DBE1\" cx=\"17.5\" cy=\"17.375\" rx=\"17.5\" ry=\"17.375\"></ellipse>\n                                        <ellipse id=\"Oval-2\" fill=\"#BEC8D2\" cx=\"17.5\" cy=\"17.375\" rx=\"12.5\" ry=\"12.4107143\"></ellipse>\n                                        <ellipse id=\"Oval-2\" fill=\"#939CA5\" cx=\"17.5\" cy=\"17.375\" rx=\"7.5\" ry=\"7.44642857\"></ellipse>\n                                        <path d=\"M44.9736119,25.2438977 L17.6278175,17.5794118 C17.4969764,17.5794118 17.3661352,17.5794118 17.3007147,17.644365 C17.2352941,17.7093183 17.2352941,17.9041781 17.2352941,17.9691314 L24.7586586,45.3144585 C24.8240792,45.444365 24.8894997,45.5742716 25.0857614,45.5742716 L25.0857614,45.5742716 C25.2166025,45.5742716 25.3474437,45.5093183 25.4128642,45.3794118 L30.9081913,31.1546454 L45.0390324,25.8934305 C45.1698736,25.8284772 45.2352941,25.6985706 45.2352941,25.5686641 C45.2352941,25.4387576 45.104453,25.308851 44.9736119,25.2438977 Z\" id=\"Shape\" fill=\"#4A555B\"></path>\n                                    </g>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipLookAround\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--look docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Look Around\">Look Around</span>\n\n                        <span id=\"instruction\" class=\"c-bimwalk-tooltip__instruction\" data-i18n=\"Drag with left key on view\">Drag with left key on view</span>\n\n                        <svg id=\"Layer_1\" data-name=\"Layer 1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"66\" height=\"60\" viewBox=\"0 0 66 60\">\n                            <g id=\"3D-LMV\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"First-Person---Guides---Desktop---light\" transform=\"translate(-477.000000, -462.000000)\">\n                                    <g id=\"gesture-left-drag-w\" transform=\"translate(477.000000, 462.435714)\">\n                                        <g id=\"_Group_\" opacity=\"0.1\" transform=\"translate(36.000000, 13.900000)\" fill=\"#D4DBE1\">\n                                            <g id=\"_Group_2\">\n                                                <rect id=\"_Rectangle_\" x=\"0.9\" y=\"0\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                            </g>\n                                        </g>\n                                        <g id=\"_Group_3\" opacity=\"0.2\" transform=\"translate(30.000000, 13.900000)\" fill=\"#BEC8D2\">\n                                            <g id=\"_Group_4\">\n                                                <rect id=\"_Rectangle_2\" x=\"0.8\" y=\"0\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                            </g>\n                                        </g>\n                                        <g id=\"_Group_5\" opacity=\"0.3\" transform=\"translate(25.000000, 13.900000)\" fill=\"#939CA5\">\n                                            <g id=\"_Group_6\">\n                                                <rect id=\"_Rectangle_3\" x=\"0.1\" y=\"0\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                            </g>\n                                        </g>\n                                        <g id=\"_Group_7\" transform=\"translate(0.000000, 13.900000)\">\n                                            <g id=\"_Group_8\" opacity=\"0.1\" fill=\"#D4DBE1\">\n                                                <g id=\"_Group_9\">\n                                                    <rect id=\"_Rectangle_4\" transform=\"translate(14.600000, 22.935000) rotate(180.000000) translate(-14.600000, -22.935000) \" x=\"0.1\" y=\"0.0992857143\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                                </g>\n                                            </g>\n                                            <g id=\"_Group_10\" opacity=\"0.2\" transform=\"translate(6.000000, 0.000000)\" fill=\"#BEC8D2\">\n                                                <g id=\"_Group_11\">\n                                                    <rect id=\"_Rectangle_5\" transform=\"translate(14.800000, 22.935000) rotate(180.000000) translate(-14.800000, -22.935000) \" x=\"0.3\" y=\"0.0992857143\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                                </g>\n                                            </g>\n                                            <g id=\"_Group_12\" opacity=\"0.3\" transform=\"translate(11.000000, 0.000000)\" fill=\"#939CA5\">\n                                                <g id=\"_Group_13\">\n                                                    <rect id=\"_Rectangle_6\" transform=\"translate(15.300000, 22.935000) rotate(180.000000) translate(-15.300000, -22.935000) \" x=\"0.8\" y=\"0.0992857143\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                                </g>\n                                            </g>\n                                        </g>\n                                        <g id=\"_Group_14\" transform=\"translate(18.000000, 13.900000)\" fill=\"#4A555B\">\n                                            <g id=\"_Group_15\">\n                                                <rect id=\"_Rectangle_7\" x=\"0\" y=\"0\" width=\"29\" height=\"45.6714286\" rx=\"14.5\"></rect>\n                                            </g>\n                                        </g>\n                                        <path d=\"M33.2,30.2821429 L33.2,16.3821429 L33.4,16.3821429 C26.6,16.3821429 20.2,21.6442857 20.2,28.3957143 L20.2,30.2821429 L33.2,30.2821429 Z\" id=\"_Path_\" fill=\"#FFFFFF\"></path>\n                                        <rect id=\"_Rectangle_8\" fill=\"#939CA5\" transform=\"translate(32.400000, 3.971429) rotate(180.000000) translate(-32.400000, -3.971429) \" x=\"27.6\" y=\"1.98571429\" width=\"9.6\" height=\"3.97142857\"></rect>\n                                        <polygon id=\"_Path_2\" fill=\"#939CA5\" points=\"36.6 7.94285714 36.6 0 40.6 3.97142857\"></polygon>\n                                        <g id=\"_Group_16\" transform=\"translate(24.000000, 0.000000)\" fill=\"#939CA5\">\n                                            <polygon id=\"_Path_3\" points=\"4.7 0 4.7 7.94285714 0.6 3.97142857\"></polygon>\n                                        </g>\n                                    </g>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n\n                    <div id=\"tooltipAdjustSpeed\" class=\"c-bimwalk-tooltip__tip c-bimwalk-tooltip__tip--speed docking-panel-container-solid-color-c\">\n                        <span id=\"tipTitle\" class=\"c-bimwalk-tooltip__subtitle\" data-i18n=\"Adjust Speed\">Adjust Speed</span>\n                    \n                        <svg width=\"80px\" height=\"36px\" viewBox=\"0 0 80 36\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n                            <g id=\"Symbols\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n                                <g id=\"graphic-key-minus-plus\">\n                                    <rect id=\"Rectangle-3-Copy-8\" fill=\"#FFFFFF\" x=\"44\" y=\"5.68434189e-15\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"+\" fill=\"#4E4E4E\" points=\"58 18.5869141 58 16.8027344 60.8027344 16.8027344 60.8027344 14 62.6005859 14 62.6005859 16.8027344 65.4033203 16.8027344 65.4033203 18.5869141 62.6005859 18.5869141 62.6005859 21.4033203 60.8027344 21.4033203 60.8027344 18.5869141\"></polygon>\n                                    <rect id=\"Rectangle-3-Copy-7\" fill=\"#FFFFFF\" x=\"0\" y=\"5.68434189e-15\" width=\"36\" height=\"36\" rx=\"4\"></rect>\n                                    <polygon id=\"–\" fill=\"#4E4E4E\" points=\"14 17 21.8408203 17 21.8408203 18.4902344 14 18.4902344\"></polygon>\n                                </g>\n                            </g>\n                        </svg>\n                    </div>\n                </div>\n            </div>\n\n            <div class=\"c-bimwalk-tooltip__actions\">\n                <span id=\"tooltipOk\" class=\"c-bimwalk-tooltip__action docking-panel-primary-button\" data-i18n=\"Ok Got It\">\n                    OK, got it.\n                </span>\n\n                <span id=\"dontRemind\" class=\"c-bimwalk-tooltip__action docking-panel-secondary-button\" data-i18n=\"Dont remind me again\">\n                    Don't remind me again.\n                </span>\n            </div>\n        </div>\n    </div>\n</div>\n"

/***/ }),

/***/ "./extensions/BimWalk/UI/icon-information.svg":
/*!****************************************************!*\
  !*** ./extensions/BimWalk/UI/icon-information.svg ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = "\"data:image/svg+xml,%3C?xml version='1.0' encoding='UTF-8' standalone='no'?%3E %3Csvg width='24px' height='24px' viewBox='0 0 24 24' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E %3Ctitle%3Eicon-information%3C/title%3E %3Cdesc%3ECreated with Sketch.%3C/desc%3E %3Cdefs%3E%3C/defs%3E %3Cg id='Symbols' stroke='none' stroke-width='1' fill='none' fill-rule='evenodd'%3E %3Cg id='icon-information' fill='%23ffffff'%3E %3Cpath d='M13.75,11.1484375 C13.75,10.796875 13.6328125,10.5625 13.515625,10.2109375 C13.28125,9.625 12.6953125,9.2734375 11.875,9.2734375 C11.171875,9.2734375 10.5859375,9.625 10.234375,10.2109375 C10.1171875,10.5625 10,10.796875 10,11.1484375 L10,18.296875 L10.234375,19.234375 C10.5859375,19.8203125 11.0546875,20.171875 11.875,20.171875 C12.6953125,20.171875 13.1640625,19.8203125 13.515625,19.234375 L13.75,18.296875 L13.75,11.1484375 L13.75,11.1484375 Z M13.75,5.7578125 C13.75,5.2890625 13.515625,4.8203125 13.1640625,4.46875 C12.8125,4.1171875 12.4609375,4 11.9921875,4 C11.5234375,4 11.0546875,4.1171875 10.703125,4.46875 C10.3515625,4.8203125 10.234375,5.2890625 10.234375,5.7578125 C10.234375,6.2265625 10.3515625,6.6953125 10.703125,7.046875 C11.0546875,7.3984375 11.5234375,7.515625 11.9921875,7.515625 C12.4609375,7.515625 12.9296875,7.3984375 13.1640625,7.046875 C13.6328125,6.6953125 13.75,6.2265625 13.75,5.7578125 Z' id='Shape'%3E%3C/path%3E %3C/g%3E %3C/g%3E %3C/svg%3E\""

/***/ }),

/***/ "./node_modules/css-loader/index.js!./extensions/BimWalk/UI/NavigatorMobileJoystick.css":
/*!*************************************************************************************!*\
  !*** ./node_modules/css-loader!./extensions/BimWalk/UI/NavigatorMobileJoystick.css ***!
  \*************************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
// imports


// module
exports.push([module.i, ".adsk-viewing-viewer .mobile-joystick.visible {\n    display: block;\n}\n\n.adsk-viewing-viewer .mobile-joystick {\n    display: none;\n    position: absolute;\n    width: 0px;\n    height: 0px;\n    z-index: 10;\n}\n\n.adsk-viewing-viewer .mobile-joystick-handle.focus {\n    background: rgba(255,255,255,1);\n}\n\n.adsk-viewing-viewer .mobile-joystick-handle.transition {\n    transition: 0.2s;\n}\n\n.adsk-viewing-viewer .mobile-joystick-handle {\n    border-radius: 100%;\n    display: inherit;\n    position: fixed;\n    background: rgba(255, 255, 255, 0.80);\n    box-shadow: -3px 3px 6px 0px rgba(0, 0, 0, 0.15);\n}\n\n.adsk-viewing-viewer .mobile-joystick-back-circle.focus {\n    \n}\n\n.adsk-viewing-viewer .mobile-joystick-back-circle {\n    pointer-events: none;\n    display: inherit;\n    border-radius: 100%;\n    background: rgba(95, 95, 95, 0.3);\n    border-color: rgba(255, 255, 255, 0.85);\n    border-width: 2px;\n    border-style: solid;\n    left: -3px;\n    top: -3px;\n}\n\n.adsk-viewing-viewer .mobile-joystick-arrow {\n    position: fixed;\n    opacity: 0.3;\n    background-image: url();\n    background-size: contain;\n}\n\n.adsk-viewing-viewer .mobile-joystick-arrow.arrow-up {\n    /*left: 63px;\n    top: 5px;*/\n}\n\n.adsk-viewing-viewer .mobile-joystick-arrow.arrow-right {\n    left: 120px;\n    top: 63px;\n    transform: rotate(90deg);\n}\n\n.adsk-viewing-viewer .mobile-joystick-arrow.arrow-down {\n    left: 63px;\n    top: 120px;\n    transform: rotate(180deg);\n}\n\n.adsk-viewing-viewer .mobile-joystick-arrow.arrow-left {\n    left: 5px;\n    top: 63px;\n    transform: rotate(270deg);\n}", ""]);

// exports


/***/ }),

/***/ "./node_modules/css-loader/index.js!./extensions/BimWalk/UI/NavigatorSimple.css":
/*!*****************************************************************************!*\
  !*** ./node_modules/css-loader!./extensions/BimWalk/UI/NavigatorSimple.css ***!
  \*****************************************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

var escape = __webpack_require__(/*! ../../../node_modules/css-loader/lib/url/escape.js */ "./node_modules/css-loader/lib/url/escape.js");
exports = module.exports = __webpack_require__(/*! ../../../node_modules/css-loader/lib/css-base.js */ "./node_modules/css-loader/lib/css-base.js")(false);
// imports


// module
exports.push([module.i, ".adsk-viewing-viewer .bimwalk .speed {\n    min-width: 0;\n    min-height: 0;\n    display: block;\n    position: absolute;\n    left: calc(50% - 83px);\n    top: 30px;\n    width: 160px;\n    height: 34px;\n    opacity: 0;\n    transform: translate(0, 10px);\n    pointer-events: none;\n    webkit-transition: opacity 0.5s ease-in-out, transform 0.5s ease-in-out;\n    -moz-transition: opacity 0.5s ease-in-out, transform 0.5s ease-in-out;\n    -ms-transition: opacity 0.5 ease-in-out, transform 0.5s ease-in-out;\n    -o-transition: opacity 0.5s ease-in-out, transform 0.5s ease-in-out;\n    transition: opacity 0.5s ease-in-out, transform 0.5s ease-in-out;\n}\n\n.adsk-viewing-viewer .bimwalk .speed-text {\n    padding-top: 8px;\n}\n\n.adsk-viewing-viewer .bimwalk .speed.open {\n    opacity: 1.0;\n    pointer-events: all;\n    transform: translate(0, 0);\n}\n\n.adsk-viewing-viewer .bimwalk .tooltip-info {\n    display: block;\n    position: absolute;\n    right: 12px;\n    cursor: pointer;\n    top: 10px;\n    opacity: 0;\n    width: 30px;\n    height: 30px;\n    background-color: rgba(34, 34, 34, 0.4);\n    box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);\n    border-radius: 50%;\n    transition: opacity 0.2s ease;\n    z-index: 1;\n    pointer-events: none;\n}\n\n.adsk-viewing-viewer .bimwalk .info-icon {\n    display: block;\n    width: 24px;\n    height: 24px;\n    margin: 2.5px 2.5px 2.5px 2.5px;\n    background: url(" + escape(__webpack_require__(/*! ./icon-information.svg */ "./extensions/BimWalk/UI/icon-information.svg")) + ");\n    background-size: contain;\n}\n\n.adsk-viewing-viewer .bimwalk .tooltip-info.open {\n    opacity: 0.7;\n    pointer-events: all;\n}\n\n.adsk-viewing-viewer .bimwalk .tooltip-info:hover {\n    opacity: 1.0;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip {\n    position: absolute;\n    top: 0;\n    bottom: 0;\n    left: 0;\n    right: 0;\n    opacity: 0;\n    pointer-events: none;\n    overflow: auto;\n    z-index: 6;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip--open {\n    opacity: 1.0;\n    pointer-events: all;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip * {\n    box-sizing: border-box !important;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__content {\n    position: absolute;\n    top: 50%;\n    left: 50%;\n    width: 620px;\n    height: 520px;\n    transform: translate(-50%, -50%);\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__title {\n    font-size: 16px;\n    font-weight: bold;\n    display: block;\n    text-align: center;\n    margin-bottom: 20px;\n    line-height: 19px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__close {\n    position: absolute;\n    top:5px;\n    right: -30px;\n    cursor: pointer;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__row {\n    clear: left;\n    height: 135px;\n    margin-bottom: 5px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip {\n    border-radius: 5px;\n    padding: 28px 0;\n    width: 100%;\n    position: relative;\n    text-align: center;\n    font-size: 0;\n    height: 135px;\n    display: block;\n    float: left;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip + .c-bimwalk-tooltip__tip {\n    margin-left: 5px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__subtitle {\n    position: absolute;\n    left: 14px;\n    top: 12px;\n    font-size: 14px;\n    font-weight: bold;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__instruction {\n    position: absolute;\n    left: 14px;\n    bottom: 12px;\n    font-size: 12px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--walk {\n    padding: 26px 14px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--walk svg {\n    height: 79px;\n    display: inline-block;\n    margin: 0 26px;\n}\n\n.adsk-viewing-viewer .bimwalk .bimwalk-tooltip-or {\n    font-size: 12px;\n    font-weight: bold;\n    position: absolute;\n    bottom: 27px;\n    left: 50%;\n    transform: translateX(-50%);\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--updown {\n    padding: 53px 0 45px;\n    width: 307px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--updown svg {\n    height: 37px;\n    display: block;\n    margin: 0 auto;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--run {\n    padding: 53px 0 45px;\n    width: 308px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__shift {\n    height: 37px;\n    display: inline-block;\n    margin: 0;\n    vertical-align: middle;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__plus {\n    width: 11px;\n    display: inline-block;\n    margin: 0 16px 0 19px;\n    vertical-align: middle;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__direction {\n    font-size: 12px;\n    font-weight: bold;\n    display: inline-block;\n    position: relative;\n    top: 4px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--teleport {\n    width: 203px;\n    padding: 45px 0 44px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--teleport svg {\n    height: 46px;\n    display: block;\n    margin: 0 auto;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--look {\n    width: 204px;\n    padding: 37px 0;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--look svg {\n    height: 61px;\n    display: block;\n    margin: 0 auto;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--speed {\n    width: 203px;\n    padding: 55px 0 45px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__tip--speed svg {\n    height: 36px;\n    display: block;\n    margin: 0 auto;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__actions {\n    text-align: center;\n    margin-top: 35px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__action {\n    display: inline-block;\n    width: 240px;\n}\n\n.adsk-viewing-viewer .bimwalk .c-bimwalk-tooltip__action + .c-bimwalk-tooltip__action {\n    margin-left: 1px;\n}\n", ""]);

// exports


/***/ }),

/***/ "./node_modules/css-loader/lib/css-base.js":
/*!*************************************************!*\
  !*** ./node_modules/css-loader/lib/css-base.js ***!
  \*************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/
// css base code, injected by the css-loader
module.exports = function(useSourceMap) {
	var list = [];

	// return the list of modules as css string
	list.toString = function toString() {
		return this.map(function (item) {
			var content = cssWithMappingToString(item, useSourceMap);
			if(item[2]) {
				return "@media " + item[2] + "{" + content + "}";
			} else {
				return content;
			}
		}).join("");
	};

	// import a list of modules into the list
	list.i = function(modules, mediaQuery) {
		if(typeof modules === "string")
			modules = [[null, modules, ""]];
		var alreadyImportedModules = {};
		for(var i = 0; i < this.length; i++) {
			var id = this[i][0];
			if(typeof id === "number")
				alreadyImportedModules[id] = true;
		}
		for(i = 0; i < modules.length; i++) {
			var item = modules[i];
			// skip already imported module
			// this implementation is not 100% perfect for weird media query combinations
			//  when a module is imported multiple times with different media queries.
			//  I hope this will never occur (Hey this way we have smaller bundles)
			if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
				if(mediaQuery && !item[2]) {
					item[2] = mediaQuery;
				} else if(mediaQuery) {
					item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
				}
				list.push(item);
			}
		}
	};
	return list;
};

function cssWithMappingToString(item, useSourceMap) {
	var content = item[1] || '';
	var cssMapping = item[3];
	if (!cssMapping) {
		return content;
	}

	if (useSourceMap && typeof btoa === 'function') {
		var sourceMapping = toComment(cssMapping);
		var sourceURLs = cssMapping.sources.map(function (source) {
			return '/*# sourceURL=' + cssMapping.sourceRoot + source + ' */'
		});

		return [content].concat(sourceURLs).concat([sourceMapping]).join('\n');
	}

	return [content].join('\n');
}

// Adapted from convert-source-map (MIT)
function toComment(sourceMap) {
	// eslint-disable-next-line no-undef
	var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap))));
	var data = 'sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64;

	return '/*# ' + data + ' */';
}


/***/ }),

/***/ "./node_modules/css-loader/lib/url/escape.js":
/*!***************************************************!*\
  !*** ./node_modules/css-loader/lib/url/escape.js ***!
  \***************************************************/
/*! no static exports found */
/***/ (function(module, exports) {

module.exports = function escape(url) {
    if (typeof url !== 'string') {
        return url
    }
    // If url is already wrapped in quotes, remove them
    if (/^['"].*['"]$/.test(url)) {
        url = url.slice(1, -1);
    }
    // Should url be wrapped?
    // See https://drafts.csswg.org/css-values-3/#urls
    if (/["'() \t\n]/.test(url)) {
        return '"' + url.replace(/"/g, '\\"').replace(/\n/g, '\\n') + '"'
    }

    return url
}


/***/ }),

/***/ "./node_modules/style-loader/lib/addStyles.js":
/*!****************************************************!*\
  !*** ./node_modules/style-loader/lib/addStyles.js ***!
  \****************************************************/
/*! no static exports found */
/***/ (function(module, exports, __webpack_require__) {

/*
	MIT License http://www.opensource.org/licenses/mit-license.php
	Author Tobias Koppers @sokra
*/

var stylesInDom = {};

var	memoize = function (fn) {
	var memo;

	return function () {
		if (typeof memo === "undefined") memo = fn.apply(this, arguments);
		return memo;
	};
};

var isOldIE = memoize(function () {
	// Test for IE <= 9 as proposed by Browserhacks
	// @see http://browserhacks.com/#hack-e71d8692f65334173fee715c222cb805
	// Tests for existence of standard globals is to allow style-loader
	// to operate correctly into non-standard environments
	// @see https://github.com/webpack-contrib/style-loader/issues/177
	return window && document && document.all && !window.atob;
});

var getTarget = function (target, parent) {
  if (parent){
    return parent.querySelector(target);
  }
  return document.querySelector(target);
};

var getElement = (function (fn) {
	var memo = {};

	return function(target, parent) {
                // If passing function in options, then use it for resolve "head" element.
                // Useful for Shadow Root style i.e
                // {
                //   insertInto: function () { return document.querySelector("#foo").shadowRoot }
                // }
                if (typeof target === 'function') {
                        return target();
                }
                if (typeof memo[target] === "undefined") {
			var styleTarget = getTarget.call(this, target, parent);
			// Special case to return head of iframe instead of iframe itself
			if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {
				try {
					// This will throw an exception if access to iframe is blocked
					// due to cross-origin restrictions
					styleTarget = styleTarget.contentDocument.head;
				} catch(e) {
					styleTarget = null;
				}
			}
			memo[target] = styleTarget;
		}
		return memo[target]
	};
})();

var singleton = null;
var	singletonCounter = 0;
var	stylesInsertedAtTop = [];

var	fixUrls = __webpack_require__(/*! ./urls */ "./node_modules/style-loader/lib/urls.js");

module.exports = function(list, options) {
	if (typeof DEBUG !== "undefined" && DEBUG) {
		if (typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
	}

	options = options || {};

	options.attrs = typeof options.attrs === "object" ? options.attrs : {};

	// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
	// tags it will allow on a page
	if (!options.singleton && typeof options.singleton !== "boolean") options.singleton = isOldIE();

	// By default, add <style> tags to the <head> element
        if (!options.insertInto) options.insertInto = "head";

	// By default, add <style> tags to the bottom of the target
	if (!options.insertAt) options.insertAt = "bottom";

	var styles = listToStyles(list, options);

	addStylesToDom(styles, options);

	return function update (newList) {
		var mayRemove = [];

		for (var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];

			domStyle.refs--;
			mayRemove.push(domStyle);
		}

		if(newList) {
			var newStyles = listToStyles(newList, options);
			addStylesToDom(newStyles, options);
		}

		for (var i = 0; i < mayRemove.length; i++) {
			var domStyle = mayRemove[i];

			if(domStyle.refs === 0) {
				for (var j = 0; j < domStyle.parts.length; j++) domStyle.parts[j]();

				delete stylesInDom[domStyle.id];
			}
		}
	};
};

function addStylesToDom (styles, options) {
	for (var i = 0; i < styles.length; i++) {
		var item = styles[i];
		var domStyle = stylesInDom[item.id];

		if(domStyle) {
			domStyle.refs++;

			for(var j = 0; j < domStyle.parts.length; j++) {
				domStyle.parts[j](item.parts[j]);
			}

			for(; j < item.parts.length; j++) {
				domStyle.parts.push(addStyle(item.parts[j], options));
			}
		} else {
			var parts = [];

			for(var j = 0; j < item.parts.length; j++) {
				parts.push(addStyle(item.parts[j], options));
			}

			stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
		}
	}
}

function listToStyles (list, options) {
	var styles = [];
	var newStyles = {};

	for (var i = 0; i < list.length; i++) {
		var item = list[i];
		var id = options.base ? item[0] + options.base : item[0];
		var css = item[1];
		var media = item[2];
		var sourceMap = item[3];
		var part = {css: css, media: media, sourceMap: sourceMap};

		if(!newStyles[id]) styles.push(newStyles[id] = {id: id, parts: [part]});
		else newStyles[id].parts.push(part);
	}

	return styles;
}

function insertStyleElement (options, style) {
	var target = getElement(options.insertInto)

	if (!target) {
		throw new Error("Couldn't find a style target. This probably means that the value for the 'insertInto' parameter is invalid.");
	}

	var lastStyleElementInsertedAtTop = stylesInsertedAtTop[stylesInsertedAtTop.length - 1];

	if (options.insertAt === "top") {
		if (!lastStyleElementInsertedAtTop) {
			target.insertBefore(style, target.firstChild);
		} else if (lastStyleElementInsertedAtTop.nextSibling) {
			target.insertBefore(style, lastStyleElementInsertedAtTop.nextSibling);
		} else {
			target.appendChild(style);
		}
		stylesInsertedAtTop.push(style);
	} else if (options.insertAt === "bottom") {
		target.appendChild(style);
	} else if (typeof options.insertAt === "object" && options.insertAt.before) {
		var nextSibling = getElement(options.insertAt.before, target);
		target.insertBefore(style, nextSibling);
	} else {
		throw new Error("[Style Loader]\n\n Invalid value for parameter 'insertAt' ('options.insertAt') found.\n Must be 'top', 'bottom', or Object.\n (https://github.com/webpack-contrib/style-loader#insertat)\n");
	}
}

function removeStyleElement (style) {
	if (style.parentNode === null) return false;
	style.parentNode.removeChild(style);

	var idx = stylesInsertedAtTop.indexOf(style);
	if(idx >= 0) {
		stylesInsertedAtTop.splice(idx, 1);
	}
}

function createStyleElement (options) {
	var style = document.createElement("style");

	if(options.attrs.type === undefined) {
		options.attrs.type = "text/css";
	}

	if(options.attrs.nonce === undefined) {
		var nonce = getNonce();
		if (nonce) {
			options.attrs.nonce = nonce;
		}
	}

	addAttrs(style, options.attrs);
	insertStyleElement(options, style);

	return style;
}

function createLinkElement (options) {
	var link = document.createElement("link");

	if(options.attrs.type === undefined) {
		options.attrs.type = "text/css";
	}
	options.attrs.rel = "stylesheet";

	addAttrs(link, options.attrs);
	insertStyleElement(options, link);

	return link;
}

function addAttrs (el, attrs) {
	Object.keys(attrs).forEach(function (key) {
		el.setAttribute(key, attrs[key]);
	});
}

function getNonce() {
	if (false) {}

	return __webpack_require__.nc;
}

function addStyle (obj, options) {
	var style, update, remove, result;

	// If a transform function was defined, run it on the css
	if (options.transform && obj.css) {
	    result = typeof options.transform === 'function'
		 ? options.transform(obj.css) 
		 : options.transform.default(obj.css);

	    if (result) {
	    	// If transform returns a value, use that instead of the original css.
	    	// This allows running runtime transformations on the css.
	    	obj.css = result;
	    } else {
	    	// If the transform function returns a falsy value, don't add this css.
	    	// This allows conditional loading of css
	    	return function() {
	    		// noop
	    	};
	    }
	}

	if (options.singleton) {
		var styleIndex = singletonCounter++;

		style = singleton || (singleton = createStyleElement(options));

		update = applyToSingletonTag.bind(null, style, styleIndex, false);
		remove = applyToSingletonTag.bind(null, style, styleIndex, true);

	} else if (
		obj.sourceMap &&
		typeof URL === "function" &&
		typeof URL.createObjectURL === "function" &&
		typeof URL.revokeObjectURL === "function" &&
		typeof Blob === "function" &&
		typeof btoa === "function"
	) {
		style = createLinkElement(options);
		update = updateLink.bind(null, style, options);
		remove = function () {
			removeStyleElement(style);

			if(style.href) URL.revokeObjectURL(style.href);
		};
	} else {
		style = createStyleElement(options);
		update = applyToTag.bind(null, style);
		remove = function () {
			removeStyleElement(style);
		};
	}

	update(obj);

	return function updateStyle (newObj) {
		if (newObj) {
			if (
				newObj.css === obj.css &&
				newObj.media === obj.media &&
				newObj.sourceMap === obj.sourceMap
			) {
				return;
			}

			update(obj = newObj);
		} else {
			remove();
		}
	};
}

var replaceText = (function () {
	var textStore = [];

	return function (index, replacement) {
		textStore[index] = replacement;

		return textStore.filter(Boolean).join('\n');
	};
})();

function applyToSingletonTag (style, index, remove, obj) {
	var css = remove ? "" : obj.css;

	if (style.styleSheet) {
		style.styleSheet.cssText = replaceText(index, css);
	} else {
		var cssNode = document.createTextNode(css);
		var childNodes = style.childNodes;

		if (childNodes[index]) style.removeChild(childNodes[index]);

		if (childNodes.length) {
			style.insertBefore(cssNode, childNodes[index]);
		} else {
			style.appendChild(cssNode);
		}
	}
}

function applyToTag (style, obj) {
	var css = obj.css;
	var media = obj.media;

	if(media) {
		style.setAttribute("media", media)
	}

	if(style.styleSheet) {
		style.styleSheet.cssText = css;
	} else {
		while(style.firstChild) {
			style.removeChild(style.firstChild);
		}

		style.appendChild(document.createTextNode(css));
	}
}

function updateLink (link, options, obj) {
	var css = obj.css;
	var sourceMap = obj.sourceMap;

	/*
		If convertToAbsoluteUrls isn't defined, but sourcemaps are enabled
		and there is no publicPath defined then lets turn convertToAbsoluteUrls
		on by default.  Otherwise default to the convertToAbsoluteUrls option
		directly
	*/
	var autoFixUrls = options.convertToAbsoluteUrls === undefined && sourceMap;

	if (options.convertToAbsoluteUrls || autoFixUrls) {
		css = fixUrls(css);
	}

	if (sourceMap) {
		// http://stackoverflow.com/a/26603875
		css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
	}

	var blob = new Blob([css], { type: "text/css" });

	var oldSrc = link.href;

	link.href = URL.createObjectURL(blob);

	if(oldSrc) URL.revokeObjectURL(oldSrc);
}


/***/ }),

/***/ "./node_modules/style-loader/lib/urls.js":
/*!***********************************************!*\
  !*** ./node_modules/style-loader/lib/urls.js ***!
  \***********************************************/
/*! no static exports found */
/***/ (function(module, exports) {


/**
 * When source maps are enabled, `style-loader` uses a link element with a data-uri to
 * embed the css on the page. This breaks all relative urls because now they are relative to a
 * bundle instead of the current page.
 *
 * One solution is to only use full urls, but that may be impossible.
 *
 * Instead, this function "fixes" the relative urls to be absolute according to the current page location.
 *
 * A rudimentary test suite is located at `test/fixUrls.js` and can be run via the `npm test` command.
 *
 */

module.exports = function (css) {
  // get current location
  var location = typeof window !== "undefined" && window.location;

  if (!location) {
    throw new Error("fixUrls requires window.location");
  }

	// blank or null?
	if (!css || typeof css !== "string") {
	  return css;
  }

  var baseUrl = location.protocol + "//" + location.host;
  var currentDir = baseUrl + location.pathname.replace(/\/[^\/]*$/, "/");

	// convert each url(...)
	/*
	This regular expression is just a way to recursively match brackets within
	a string.

	 /url\s*\(  = Match on the word "url" with any whitespace after it and then a parens
	   (  = Start a capturing group
	     (?:  = Start a non-capturing group
	         [^)(]  = Match anything that isn't a parentheses
	         |  = OR
	         \(  = Match a start parentheses
	             (?:  = Start another non-capturing groups
	                 [^)(]+  = Match anything that isn't a parentheses
	                 |  = OR
	                 \(  = Match a start parentheses
	                     [^)(]*  = Match anything that isn't a parentheses
	                 \)  = Match a end parentheses
	             )  = End Group
              *\) = Match anything and then a close parens
          )  = Close non-capturing group
          *  = Match anything
       )  = Close capturing group
	 \)  = Match a close parens

	 /gi  = Get all matches, not the first.  Be case insensitive.
	 */
	var fixedCss = css.replace(/url\s*\(((?:[^)(]|\((?:[^)(]+|\([^)(]*\))*\))*)\)/gi, function(fullMatch, origUrl) {
		// strip quotes (if they exist)
		var unquotedOrigUrl = origUrl
			.trim()
			.replace(/^"(.*)"$/, function(o, $1){ return $1; })
			.replace(/^'(.*)'$/, function(o, $1){ return $1; });

		// already a full url? no change
		if (/^(#|data:|http:\/\/|https:\/\/|file:\/\/\/|\s*$)/i.test(unquotedOrigUrl)) {
		  return fullMatch;
		}

		// convert the url to a full url
		var newUrl;

		if (unquotedOrigUrl.indexOf("//") === 0) {
		  	//TODO: should we add protocol?
			newUrl = unquotedOrigUrl;
		} else if (unquotedOrigUrl.indexOf("/") === 0) {
			// path should be relative to the base url
			newUrl = baseUrl + unquotedOrigUrl; // already starts with '/'
		} else {
			// path should be relative to current directory
			newUrl = currentDir + unquotedOrigUrl.replace(/^\.\//, ""); // Strip leading './'
		}

		// send back the fixed url(...)
		return "url(" + JSON.stringify(newUrl) + ")";
	});

	// send back the fixed css
	return fixedCss;
};


/***/ })

/******/ });